Java 中的 Float 惹恼了 17721.415

问题描述 投票:0回答:1
package net.smart;

public class Bakwas{

    public static void main(String[] args){

        float f = 17721.415f;

        System.out.println(f);

   }

}

输出为 17721.414 不是 17721.415 我们遇到的问题是,在计算中,我们有 149.75 小时,费率为 118.34,Web 服务接受的值是 17721.415、17721.416 和 17721.42,但由于发送了 17721.414 的值,因此它被拒绝。

我在运行时 Java 8、17 和 21 中看到了这一点

我将小数点到小数点后第二位与小数点第三位连接起来,然后它的工作方式为 17721.416 请解释原因并给出任何其他修复

我知道我可以使用 double 但之后,如果我需要将此值分配给浮点变量,那么即使在该转换上再次打印 17721.414

java precision
1个回答
0
投票

值 17721.415 不是浮点数。 您可能还会问如何将“yippee”的值分配给“Color”类型的变量。事实上,任何除数不是2的幂的数字都不能用它来表示。 (.415 是 415/1000,1000 不是 2 的幂,因此,任何东西。415 都不是浮点数)。 Java 允许您编写它,并通过四舍五入到最接近的浮点数来“修复”它。因此,您想要的东西是“不可能的”。切换到不同的存储机制。 一种选择是存储 17721415。例如,如果这代表财务金额,您可以重写代码,使存储的所有数字都以“十分之一美分”而不是欧元为单位,然后定义舍入行为,以便所有数字都为始终精确到十分之一美分(毕竟,您必须在某个地方进行四舍五入)。

另一种选择是使用 BigDecimal,它可以让您存储所需的任何精度。不过,这并不是围绕必须舍入的问题的最终解决方案(例如,简单地说,不可能将任何 bigdecimal 除以 3,除非您在除法运算中指定应如何舍入)。 根据您的一条评论,您说(释义)“但在这一切结束时,它必须返回到

float

,以便我可以将其发送到您无法控制的另一个系统”。

在这种情况下,您显然拥有一个系统:

[A] 要求其输入以 

float

的形式提供给它。 [B] 该值必须是 17721.415。

这是不可能的
。该系统已损坏,根本无法使用。联系它的维护者并告诉他们修复他们的东西。 17721.415 无法表示为浮点数。

© www.soinside.com 2019 - 2024. All rights reserved.