java 小数如 Math.random()转 36 进制,求个方法
1
crclz 2021-01-12 16:15:38 +08:00
整数部分就是模 K 取余( K 是进制)。
小数部分不一定能够精确转换。 小数部分首先确定你想要的小数位数 n,然后小数部分 tmp=小数部分*(K^n),n 为精度。然后截断 tmp=(int)tmp 。然后把 tmp 转换为 K 进制数,最后移动 n 位小数点。 以上是我凭借有限的知识想出来的,具体的专门的进制转换要具体去查专门的帖子或者解决方案。 |
2
douleL OP 我是想用 java 代码模拟 js 的 :Math.random().toString(36)
|
5
ysc3839 2021-01-12 17:32:05 +08:00 via Android
去找一些嵌入式的很简单的 js 引擎,看 toString 的实现吧。
|
6
Xusually 2021-01-12 17:50:14 +08:00
Math.random()出来的小数,拆分成整数部分和小数部分分别用
Integer.toString(i, 36) 输出 |
8
AoEiuV020 2021-01-12 18:02:19 +08:00
@douleL 简单写了一段试了下了 js 能对应上,但是精度是个大问题,无法模拟 js 的精度丢失,感觉 java 的 double 精度比 js 小,bigDecimal 精度又太大,
@Test public void testRadix() { assertEquals("0.o72tt3lcjtq", toString("0.6721285152844136", 36)); } public String toString(String number, int radix) { BigDecimal N = new BigDecimal(number); StringBuilder sb = new StringBuilder(); BigInteger i = N.toBigInteger(); sb.append(i.toString(radix)); sb.append('.'); while(new BigDecimal(N.intValue()).compareTo(N) != 0 && sb.length() < 13) { N = N.multiply(new BigDecimal(radix)); i = N.toBigInteger().mod(new BigDecimal(radix).toBigInteger()); sb.append(i.toString(radix)); } return sb.toString(); } |
9
AoEiuV020 2021-01-12 18:02:52 +08:00
v2ex 怎么发代码来着,
```java @Test public void testRadix() { assertEquals("0.o72tt3lcjtq", toString("0.6721285152844136", 36)); } public String toString(String number, int radix) { BigDecimal N = new BigDecimal(number); StringBuilder sb = new StringBuilder(); BigInteger i = N.toBigInteger(); sb.append(i.toString(radix)); sb.append('.'); while(new BigDecimal(N.intValue()).compareTo(N) != 0 && sb.length() < 13) { N = N.multiply(new BigDecimal(radix)); i = N.toBigInteger().mod(new BigDecimal(radix).toBigInteger()); sb.append(i.toString(radix)); } return sb.toString(); } ``` |
10
AoEiuV020 2021-01-12 18:03:03 +08:00
```
@Test public void testRadix() { assertEquals("0.o72tt3lcjtq", toString("0.6721285152844136", 36)); } public String toString(String number, int radix) { BigDecimal N = new BigDecimal(number); StringBuilder sb = new StringBuilder(); BigInteger i = N.toBigInteger(); sb.append(i.toString(radix)); sb.append('.'); while(new BigDecimal(N.intValue()).compareTo(N) != 0 && sb.length() < 13) { N = N.multiply(new BigDecimal(radix)); i = N.toBigInteger().mod(new BigDecimal(radix).toBigInteger()); sb.append(i.toString(radix)); } return sb.toString(); } ``` |
11
AoEiuV020 2021-01-12 18:05:06 +08:00
|
12
zxCoder 2021-01-12 19:34:18 +08:00
转进制不是整数部分除进制取整,小数部分乘进制取整就好了
|
13
momocraft 2021-01-12 19:36:13 +08:00
直接生成随机字符串不好吗,js 的 toString 连定长都不是
|
14
douleL OP @AoEiuV020 感谢老铁的援助 我目前也是找到类似的,和你的方法一样, 精度最后一位和 js 的不一样 暂时用的直接调用 js 引擎 还没找到解决方案
|
16
LGA1150 2021-01-20 16:58:19 +08:00
> 感觉 java 的 double 精度比 js 小
java 的 double 和 js 的 number 都是 IEEE754 双精度…… |