Java 为什么算术运算时两个双值的行为不一致

Java 为什么算术运算时两个双值的行为不一致,java,Java,下面是我的代码片段,我面临的问题是双精度算术运算 当双值=1489.260时然后除以100,我得到输出14.89260(这是正确的) 问题:但如果双值=148.9260然后除以100,得到输出1.48925999999998(四舍五入值) 问题1:为什么两种情况下的行为不同 问题2:如何在不舍入值的情况下获得输出即1.48960。 浮点计算不精确,因为这些值不能在内存位中精确表示。大多数情况下,它们是近似表示的,因此在计算中存在一些偏差 有关更多详细信息,请阅读 将无穷多个实数压缩为有限位

下面是我的代码片段,我面临的问题是双精度算术运算

双值=1489.260时
然后除以100,我得到输出
14.89260
(这是正确的)

问题:但如果
双值=148.9260
然后除以100,得到输出
1.48925999999998
(四舍五入值)

  • 问题1:为什么两种情况下的行为不同

  • 问题2:如何在不舍入值的情况下获得输出即1.48960。



浮点计算不精确,因为这些值不能在内存位中精确表示。大多数情况下,它们是近似表示的,因此在计算中存在一些偏差

有关更多详细信息,请阅读

将无穷多个实数压缩为有限位数 需要近似表示。虽然有无限的 许多整数,在大多数程序中,整数计算的结果可以 存储在32位中。相反,给定任何固定的位数, 大多数实数计算会产生 无法使用那么多位精确表示。因此 浮点计算的结果通常必须按顺序四舍五入 以适应它的有限表示。这个舍入误差是最大的 浮点运算的特点


这对于浮点计算来说是很正常的。结果永远不会精确。但是,有一些标准的解决办法:

  • 无论何时打印变量,请将精度设置为合理的值。这将确保取整在后台进行,您将看到可预测的结果
  • 在比较浮点金额时,允许有一个小的差异。e、 g.如果(abs(v2-v1)<0.000001)

处理舍入错误有两种选择:

  • 不用麻烦了。这些误差非常小,大多数时候可以忽略不计。(这对金融和科学计算无效)
  • 使用。但请注意,这可能会减慢您的程序,因此不适用于游戏
  • 除此之外,你还应该学习和学习

    此外,以下是打印浮点的方法:

    double number = 148.9260 / 100;
    System.out.printf("my number is: %.4f%n", number); 
    
    其中,
    %f
    表示浮点,
    %n
    表示换行符。
    .4
    告诉格式化程序在小数点后使用4位数字。有关更多信息,请参阅

    如果只需要字符串,可以使用


    使用BigDecimal而不是Double。顺便说一句,与变量一致最好是除以相同类型的可验证项(double/double)double总是四舍五入的,如果您想用任意数字正确表示值,请使用BigDecimal,例如。@Smutje:当我使用BigDecimal finalBid=BigDecimal.valueOf(value/unitofquote)时,结果也是1.4892599999998。我现在也在做双人/双人。但是结果是一样的。是的,因为
    value/unitofquote)
    的结果在转换为
    BigDecimal
    之前是双精度的。试着从一开始就使用
    BigDecimal
    。如果v1大于v2,你需要一个
    Math.abs
    :如果(Math.abs(v2-v1)>0.000001){/*notequal*/(我假设你想检查不等式,因为epsilon在比较时没有意义),谢谢Aburb mind。我忘了abs()测试-已编辑回复。如果我不需要打印此值,而是需要将其存储在DB中或从method@Harshit这就是“不在乎”-的情况。您应该仅出于显示目的对值进行四舍五入。如果您确实希望在DB中使用干净的浮点或从方法返回,请使用BigDecimal(或类似的东西)
    double number = 148.9260 / 100;
    System.out.printf("my number is: %.4f%n", number); 
    
    String myNumberString = String.format("%.4f", number); // no %n!