这是一个经典问题:遗留代码在使用n整数时会使用浮点数。但是,在代码中更改该变量(或几个)的每个实例都很昂贵。因此,您需要编写自己的舍入函数,该函数需要一堆参数来提高精度并转换为整数。
所以,基本的问题是,当它们在java中制作时,浮点数如何变圆?经典的例子是0.1经常引用的四舍五入到0.0999999999998(或类似的东西)。但是,当给定Java中的整数时,浮点数是否总是向下舍入到它可以表示的下一个值?是否将其内部尾数向下舍入以有效地舍入其绝对值?或者它只是选择整数和新浮点之间的最小误差值?
当String是Float.parseFloat(String)
之类的整数时,调用"1234567890"
时行为也不同吗?当String是一个比Float可以存储的精度更高的浮点时,行为也是一样的。
请注意我使用浮点或参考Float,我可以与Double交替使用。与整数和长整数相同。
答案 0 :(得分:4)
浮点数在java中制作时如何进行舍入?
当您使用(int) d
d
类型为double
或float
的构造int a = (int) Math.round(d);
时,Java会截断(向零舍入)。如果需要舍入到最接近的整数,可以使用以下行:
double
经典的例子是0.1经常被引用为四舍五入到0.0999999999998(或类似的东西)。
您提到的问题与整数不存在,整数可以完全表示为(int) Math.round(d)
(对于-2 53 和2 53 之间的那些)。如果您要舍入的数字来自之前的计算,这些计算本应产生一个整数但由于浮点舍入错误而可能没有,那么double
可能是您应该使用的解决方案。这意味着只要累积误差不高于0.5,您就会得到正确的整数。
你的遗留代码在真正使用n整数时会使用浮点数。但是,在代码中更改该变量(或几个)的每个实例都很昂贵。
如果产生d
+
的计算只是计算-
,*
,d
和其他整数,则在-2 53 和2 53 ,然后(int) d
自动包含一个整数(这是精确的,因为所涉及的浮点计算是精确的,并且它是一个整数,因为确切的结果是一个整数),您可以使用更简单的d
进行转换。另一方面,如果涉及除法或非整数操作数,则不应轻易更改Float.parseFloat(String)
的类型,因为它会改变这些计算的结果。
当String是
"1234567890"
之类的整数时调用float
时行为也不同吗?
这将生成一个1234567936.0f
,其值是理性1234567890的最近可表示的单精度值。这恰好是Float
。
当String是一个比Float可以存储的精度更高的浮点时,行为也是一样的。
从技术上讲,“0.1”比Float
可以存储的精度更高。此外,从技术上讲,前面的示例1234567890也比Float.parseFloat("0.1")
可以存储的更精确。行为是相同的:float
生成与有理数0.1最接近的{{1}}。