js 科学计数法问题

2022-01-10 13:37:37 +08:00
 leebs

js 小于 1 的数字,精度超过 6 位会自动转成科学计数法表示,如 0.0000001 ,会自动转成 1e-7 。

现在可以通过 1e-7.toFixed(7) 方法转成字符串,得到 '0.0000001'。

问题是能否用数字形式表示 0.0000001 ,而非科学计数法?

其他语言也有这个问题嘛?

2199 次点击
所在节点    JavaScript
15 条回复
registerrr
2022-01-10 13:47:29 +08:00
很多语言里有 printf ,可以满足你的要求
leebs
2022-01-10 13:49:33 +08:00
@registerrr 这个输出还是字符串吧,能否输出数字呢。
marcong95
2022-01-10 13:53:48 +08:00
不能,因为小数在内存里本身就是有以科学计数法保存的。详见 IEEE 754 ,你以为的 1e-7 其实是

0.0000000999999999999999954748111825886258685613938723690807819366455078125

执行 (1e-7).toFixed(100).replace(/\.?0+$/, '') 可得

IEEE 754 相关话题感觉都成月经贴了😂
thinkershare
2022-01-10 13:56:34 +08:00
你要先搞清楚, 你看得到的都是字符串, 没有数字, 数字层面只要 0101001, 至于你要怎么解释, 是数据类型的事情, 你看到的打印的都是各种 toString()格式化决定的, JS 使用的是 IEEE 754, 这个规范的 ToString 在小数位无效的时候, 大部分语言都选择使用科学计数法来作为字符串格式化形式, 即只有 6,7 位的有效位, 其它有效位是无效的, 因为表示整数的部分位数不够多, 精度不够
registerrr
2022-01-10 13:58:43 +08:00
@leebs 都显示到屏幕上了,还有所谓的字符串或者数字之分么。像 printf(%.1f,5.43478)这种,参数不就是传的数字么
DOLLOR
2022-01-10 14:00:19 +08:00
你需要了解一下浮点数在计算机里的表示形式。
codeduan
2022-01-10 14:09:02 +08:00
什么时候需要数字形式表示 0.0000001 呢?如果是展示需要的话,用 toFixed 就行了吧。
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)
thinkershare
2022-01-10 16:02:00 +08:00
计算机底层没有什么魔法, 都是一些超级简单而且笨拙的组合
leebs
2022-01-10 16:26:41 +08:00
科学计数法转字符串有什么现有的方法嘛?
1.123e-10 => 0.0000000001123
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'
agagega
2022-01-10 18:21:50 +08:00
你这个要求只能用 Decimal
IvanLi127
2022-01-10 23:23:46 +08:00
能,改你用来显示这数字的程序逻辑,让它按你的想法去把你不能看见的数值转换成你想看到的 0.00000001 字符串,并且和之前表示 1e-7 一样,不去显示两边的引号。
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 问题,请直接描述你想要的问题。
Jooooooooo
2022-01-11 12:59:15 +08:00
计算机只能表达 1 和 0

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/827293

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX