如何将数字从双精度转换为单精度并返回?
例如,我在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位乘法,则获得结果。
答案 0 :(得分:3)
JavaScript本身不提供任何此类功能。如果您绝对需要精确转换,我建议您使用big.js。
答案 1 :(得分:1)
JavaScript中的所有数值都是Number
s
它们都是64位浮点数。
答案 2 :(得分:1)
这会在javascript中将数字转换为float:
new Float32Array([15.603179021718429])[0]
答案是:
15.603178977966309
哎呀,更简单,使用Math.fround()
。 ES6中的新功能。