繁体   English   中英

Google Chrome 或 Node.js 中的 V8 toString(radix) 方法如何处理浮点数?

[英]How does the V8 toString(radix) method in Google Chrome or in Node.js handle floating point numbers?

该方法适用于 integer 数字,例如

(25).toString(2)
= '11001'

(25).toString(16)
= '19'

(25).toString(36)
= 'p'

但是输入浮点数会导致

(0.1).toString(2)
= '0.0001100110011001100110011001100110011001100110011001101'

(0.1).toString(16)
= '0.1999999999999a'

(0.1).toString(36)
= '0.3lllllllllm'

据说 V8 是一个开源引擎。 但是,为了理解它,我无法在存储库中找到此方法的确切实现。 function 如何处理浮点数?

(这里是 V8 开发人员。)

@pilchard 的链接是正确的; 更具体地说,您正在寻找的 function 是DoubleToRadixCString

观察到 0.1(十进制)在其二进制表示中是一个非终止分数(当然,这是计算机内部如何存储双精度数)很好地说明了0.1 * 3 == 0.30000000000000004的根本原因:非终止分数必然在某个点被截断,这构成了舍入误差,并且某些操作使这些舍入误差可见。 它是十进制中类似效果的二进制等价物:当您将 1/3 表示为“0.333333”时(任意选择 6 位数字作为表示的长度,但如果您仅在 100 位数字后切断,则不会真正改变任何东西),并且将其乘以 3,得到“0.999999”,而不是 1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM