当存储在浮点中时,java如何舍入整数

当存储在浮点中时,java如何舍入整数,java,floating-point,numbers,rounding,Java,Floating Point,Numbers,Rounding,这是一个典型的问题:您的遗留代码在实际使用n整数时使用了浮点。但是,更改代码中该变量的每个实例(或多个实例)代价高昂。因此,您需要编写自己的舍入函数,该函数需要一组参数来提高精度并转换为整数 所以,基本的问题是,当浮点数是用java制作的时候,它们是如何取整的?经典的例子是0.1,通常被引用为四舍五入到0.09999998(或类似的值)。但是,在Java中,当给定一个整数时,浮点数是否总是向下舍入到它可以表示的下一个值?它是否对其内部尾数进行四舍五入以有效地对其绝对值进行四舍五入?或者它只是选择

这是一个典型的问题:您的遗留代码在实际使用n整数时使用了浮点。但是,更改代码中该变量的每个实例(或多个实例)代价高昂。因此,您需要编写自己的舍入函数,该函数需要一组参数来提高精度并转换为整数

所以,基本的问题是,当浮点数是用java制作的时候,它们是如何取整的?经典的例子是0.1,通常被引用为四舍五入到0.09999998(或类似的值)。但是,在Java中,当给定一个整数时,浮点数是否总是向下舍入到它可以表示的下一个值?它是否对其内部尾数进行四舍五入以有效地对其绝对值进行四舍五入?或者它只是选择整数和新浮点之间误差最小的值

调用
Float.parseFloat(String)
时,当字符串是类似
“1234567890”
的整数时,行为是否也不同?当字符串是一个浮点且精度高于浮点所能存储的精度时,这种行为也是一样的

请注意,我使用浮点或参考浮点,我可以与Double互换使用。整型和长型也一样

当浮点数是用java制作的时候,它们是如何取整的

当使用构造
(int)d
时,Java会截断(向零舍入),其中
d
具有类型
double
float
。如果需要舍入到最接近的整数,可以使用以下行:

int a = (int) Math.round(d);
经典的例子是0.1,通常被引用为四舍五入到0.09999998(或类似的值)

您提到的问题不存在整数,整数可以精确表示为双精度(对于-253和253之间的整数)。如果要舍入的数字来自以前的计算,这些计算本应产生一个整数,但可能由于浮点舍入错误而没有整数,则
(int)Math.round(d)
可能是您应该使用的解决方案。这意味着,只要累积误差不超过0.5,就可以得到正确的整数

旧代码在实际使用n整数时使用浮点。但是,更改代码中该变量的每个实例(或多个实例)代价高昂

如果产生双精度
d
的计算仅是计算
+
-
*
和其他整数,产生介于-253和253之间的中间结果,则
d
自动包含一个整数(它是精确的,因为所涉及的浮点计算是精确的,它是整数,因为精确的结果是整数),您可以使用更简单的
(int)进行转换d
。另一方面,如果涉及除法或非整数操作数,则不应轻易更改
d
的类型,因为它会更改这些计算的结果

调用
Float.parseFloat(String)
时,当字符串是类似
“1234567890”
的整数时,行为是否也不同

这将产生一个
float
,其值是与rational 1234567890最接近的可表示单精度值。这恰好是
1234567936.0f

当字符串是一个浮点且精度高于浮点所能存储的精度时,这种行为也是一样的


从技术上讲,“0.1”比
Float
可以存储的精度更高。同样,从技术上讲,前面的示例1234567890也比
Float
可以存储的精度更高。行为是相同的:
Float.parseFloat(“0.1”)
生成最接近有理数0.1的
Float

无需“舍入”转换为浮点时的整数。最坏的情况是整数中的有效位数超过浮点形式中的分数位数,但这只是相当大的数的问题。从大整数到浮点(小写)时,可能会重复So在Java中,它将使用一个浮点数可以表示的最接近的数字。同样的,这个数字很长时间会加倍。另外,您是否有参考资料,因为它可能有更多的信息,对我和其他有类似问题的人有帮助。是的。是的。Java遵循IEEE 754标准的原则,该标准规定基本转换(十进制-二进制)应根据当前舍入模式。用于从浮点到整数的转换(通过截断),Java遵循的是C传统,它早于IEEE 754标准。最后,不要为其他有类似问题的人担心,他们不会阅读这个答案,就像你阅读大量现有文档一样,包括Java语言定义、关于浮点的维基百科页面……Java语言规范"从int到float,或从long到float,或从long到double的扩展原语转换可能会导致精度损失-也就是说,结果可能会丢失一些值的最低有效位。在这种情况下,生成的浮点值将是整数值的正确四舍五入版本,使用IEEE 754四舍五入到最近值模式(§4.2.4)。“Downvoter,我很高兴听到你对这个答案有什么看法。