java - 如何在 Java 中处理 float 的精度错误?

标签 java floating-point precision

我想知道在 Java 中修复精度错误的最佳方法是什么。正如您在以下示例中看到的,存在精度错误:

class FloatTest
{
  public static void main(String[] args)
  {
    Float number1 = 1.89f;
    
    for(int i = 11; i < 800; i*=2)
    {
      System.out.println("loop value: " + i);
      System.out.println(i*number1);
      System.out.println("");
    }
  }
}

显示的结果是:

loop value: 11

20.789999

loop value: 22

41.579998

loop value: 44

83.159996

loop value: 88

166.31999

loop value: 176

332.63998

loop value: 352

665.27997

loop value: 704

1330.5599

此外,如果有人可以解释为什么它只从 11 开始并且每次都将值加倍。我认为所有其他值(或至少其中许多值)都显示了正确的结果。

像这样的问题过去曾让我头疼,我通常使用数字格式化程序或将它们放入字符串中。

编辑: 正如人们提到的,我可以使用 double ,但在尝试之后,似乎 1.89 作为双倍 792 仍然输出错误(输出为 1496.8799999999999)。

我想我会尝试其他解决方案,例如 BigDecimal

最佳答案

关于java - 如何在 Java 中处理 float 的精度错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713673/

相关文章:

java - JTable 中自定义 JPanel 的奇怪行为

ruby - 如何让 ruby 显示更多的小数位?

Python 输出带有按值着色的 float 的复杂行

floating-point - 为什么 float 不正确?

java - 如何使用 Jansi 清除屏幕?

java - 如何在Java程序中将列名转换为变量?

java - Oracle JDBC优化: Enable PreparedStatement caching in a Spring boot Application

python - 乔列斯基分解浮点误差

c# - C# 中的 float 学是否一致?是真的吗?

c# - DateTime 的默认时间精度是多少?