js 小于 1 的数字,精度超过 6 位会自动转成科学计数法表示,如 0.0000001 ,会自动转成 1e-7 。
现在可以通过 1e-7.toFixed(7) 方法转成字符串,得到 '0.0000001'。
问题是能否用数字形式表示 0.0000001 ,而非科学计数法?
其他语言也有这个问题嘛?
1
registerrr 2022-01-10 13:47:29 +08:00
很多语言里有 printf ,可以满足你的要求
|
2
leebs OP @registerrr 这个输出还是字符串吧,能否输出数字呢。
|
3
marcong95 2022-01-10 13:53:48 +08:00 3
不能,因为小数在内存里本身就是有以科学计数法保存的。详见 IEEE 754 ,你以为的 1e-7 其实是
0.0000000999999999999999954748111825886258685613938723690807819366455078125 执行 (1e-7).toFixed(100).replace(/\.?0+$/, '') 可得 IEEE 754 相关话题感觉都成月经贴了😂 |
4
thinkershare 2022-01-10 13:56:34 +08:00
你要先搞清楚, 你看得到的都是字符串, 没有数字, 数字层面只要 0101001, 至于你要怎么解释, 是数据类型的事情, 你看到的打印的都是各种 toString()格式化决定的, JS 使用的是 IEEE 754, 这个规范的 ToString 在小数位无效的时候, 大部分语言都选择使用科学计数法来作为字符串格式化形式, 即只有 6,7 位的有效位, 其它有效位是无效的, 因为表示整数的部分位数不够多, 精度不够
|
5
registerrr 2022-01-10 13:58:43 +08:00
@leebs 都显示到屏幕上了,还有所谓的字符串或者数字之分么。像 printf(%.1f,5.43478)这种,参数不就是传的数字么
|
6
DOLLOR 2022-01-10 14:00:19 +08:00
你需要了解一下浮点数在计算机里的表示形式。
|
7
codeduan 2022-01-10 14:09:02 +08:00
什么时候需要数字形式表示 0.0000001 呢?如果是展示需要的话,用 toFixed 就行了吧。
|
8
thinkershare 2022-01-10 15:59:49 +08:00
你可以找一门语言的 toString()实现去看看, 底层就是拼接 0-9,.这些 char 字符, 然后组成一个 string 返回给你, 给你一个链接可以去看看, [dotnet 5 double ToString()实现]( https://github.com/dotnet/runtime/blob/af4efb1936b407ca5f4576e81484cf5687b79a26/src/libraries/System.Private.CoreLib/src/System/Number.Formatting.cs#L382)
|
9
thinkershare 2022-01-10 16:02:00 +08:00
计算机底层没有什么魔法, 都是一些超级简单而且笨拙的组合
|
10
leebs OP 科学计数法转字符串有什么现有的方法嘛?
1.123e-10 => 0.0000000001123 |
11
vone 2022-01-10 17:17:01 +08:00
@leebs https://github.com/MikeMcl/decimal.js/
const x = new Decimal(0.0000000001123) x.toFixed() // '0.0000000001123' |
12
agagega 2022-01-10 18:21:50 +08:00 via iPhone
你这个要求只能用 Decimal
|
13
IvanLi127 2022-01-10 23:23:46 +08:00 via Android
能,改你用来显示这数字的程序逻辑,让它按你的想法去把你不能看见的数值转换成你想看到的 0.00000001 字符串,并且和之前表示 1e-7 一样,不去显示两边的引号。
|
14
2i2Re2PLMaDnghL 2022-01-11 09:56:29 +08:00
我觉得你完全没理解,或者遇上了 X-Y 问题。
如果你没理解,请再看一遍 #3 实际上计算机内部既不是 0.0000001 也不是 1e-7 参考 new Uint32Array(new Float32Array([1e-7]).buffer) 结果是 [ 869711765 ],即 0x33D6BF95 (1+1/4+1/16+1/64+1/128+1/256+1/512+1/4096+1/8192+1/131072+1/262144+1/524288+1/2097152+1/4194304+1/8388608)*2^(103 - 127) = 14073749/140737488355328 = 1.0000000116860974230803549289703369140625 × 10^-7 如果遇上了 X-Y 问题,请直接描述你想要的问题。 |
15
Jooooooooo 2022-01-11 12:59:15 +08:00
计算机只能表达 1 和 0
|