javascript - JavaScript中十进制的字符串转换(十进制到字符串)
问题描述
你们能解释一下为什么string
65.00 的转换返回 65 而不是 65.00 吗?
var dec_1 = 65.01;
var dec_2 = 65.00;
var n1 = String(dec_1); // returns 65.01
var n2 = String(dec_2); // returns 65
解决方案
因为这Number.prototype.toString
就是指定的工作方式。它仅包含小数点后所需的位数,以便将数字与另一个可表示的数字区分开来。¹
如果您想要固定的小数位数,请使用toFixed
:
var dec_1 = 65.01;
var dec_2 = 65.00;
var n1 = dec_1.toFixed(2); // "65.01"
var n2 = dec_2.toFixed(2); // "65.00"
console.log(n1);
console.log(n2);
¹ 即使实际数值(如果完整打印)上会有更多的非零数字也是如此。规范中的全部细节,它实际上是一个相当复杂的过程,是重要的学术研究的主题。
例如,考虑数字1.1
:
console.log(String(1.1)); // "1.1"
很简单,对吧?除了1.1
不能在JavaScript 使用的IEEE-754 双精度浮点数类型中精确表示。当您在代码中使用时,创建的数值比 1.1略高:1.1
console.log((1.1).toFixed(52)); // "1.1000000000000000888178419700125232338905334472656250"
默认toString
不包含这些数字的原因是它们不重要。两者1.1
并1.1000000000000000888178419700125232338905334472656250
最终成为数字中的相同位模式。因此,不需要这些额外的数字来区分该数字与下一个可表示的数字。所以他们被排除在外。
你可以在这里看到:
console.log(1.1 === 1.1000000000000000888178419700125232338905334472656250); // true
推荐阅读
- python - 尝试构建 discord.py [voice] 时路径中缺少“make”实用程序
- css - 如何横向展示我的产品卡片?
- google-apps-marketplace - 除非将“共享”功能设置为共享给“知道链接的任何人”,否则“发布到 Web”功能将不再有效
- docker - 在 Azure 管道中使用 Docker 映像作为构建代理时出现错误
- java - 如果此方法中有 void 方法,如何模拟具有返回值的方法
- wpf - 如何在 xaml 中使用样式在画布上移动椭圆
- scala - IntelliJ 上的库-Scala
- bash - bash:使 grep 命令忽略带有某些特殊字符的行 $(
- javascript - TypeError:无法读取未定义的nodejs express mvc的属性'render'
- sql - 每个组都有多个结果的 max 函数