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