在javascript中在double和float精度之间转换

时间:2015-10-27 13:06:51

标签: javascript floating-point ieee-754

如何将数字从双精度转换为单精度并返回?

例如,我在Java / C / C#中有这个:

double x = 0.00001;
float f = (float)x; // should be 0.000009999999747378752 not 0.0000100000000000000008180305391403
int n = Math.floor(1001 * f / x); // should be 1000 not 1001.

(不要问。这是一些毛茸茸的C代码的简化版本,我需要以1:1的方式移植它)

另一个例子:

double y = Math.floor((double)(float)5.999999876); // should be 6.0

我已经尝试过:

var f:float = x; // syntax error
var f = x as float; // syntax error
var f = parseFloat(x); // returns full double-precision (0.0000100000000000000008180305391403)
var f = toFixed(x, ...); // Can't use this as float is not defined by number of decimal places but number of binary places.

我使用Rhino(作为Java 7的一部分),它也应该与Nashorn兼容(作为Java 8的一部分)。如果有帮助,我可以访问整个公共Java API。

[编辑]我做了一些实验,似乎问题不在浮点转换中,而是在浮点运算中。我真的需要处理器中的FPU来执行单精度fmul。如果1001 * f在双精度数中包含f的浮点精度版本,则0.00001不起作用。我获得精确结果的唯一方法是,如果我在1001f * 0.00001f上执行32位乘法,则获得结果。

3 个答案:

答案 0 :(得分:3)

JavaScript本身不提供任何此类功能。如果您绝对需要精确转换,我建议您使用big.js

答案 1 :(得分:1)

JavaScript中的所有数值都是Number s 它们都是64位浮点数。

Read more here

答案 2 :(得分:1)

这会在javascript中将数字转换为float:

new Float32Array([15.603179021718429])[0]

答案是:

15.603178977966309

哎呀,更简单,使用Math.fround()。 ES6中的新功能。