JavaScript、Java、C#精度丢失问题

70 阅读1分钟

JavaScript、Java、C#精度丢失问题

1. IEEE 754 标准

  • 二进制浮点数:IEEE 754 标准使用二进制表示浮点数,某些十进制小数无法精确转换为二进制,导致精度丢失。
  • 有限位数:浮点数的位数有限,无法精确表示所有小数,尤其在涉及大数或小数时。

2. JavaScript 中的精度丢失

  • 动态类型:JavaScript 只有一种数字类型 Number,采用双精度浮点数(64位),容易在计算中出现精度问题。

  • 示例

    console.log(0.1 + 0.2); // 输出 0.30000000000000004
    

3. Java 和 C# 中的精度丢失

  • Javafloat(32位)和 double(64位)也会出现类似问题。

    System.out.println(0.1 + 0.2); // 输出 0.30000000000000004
    
  • C#floatdouble 同样存在精度问题。

    Console.WriteLine(0.1 + 0.2); // 输出 0.30000000000000004
    

4. 解决方案

  • 高精度库:使用如 BigDecimal(Java)、decimal(C#)或 BigNumber.js(JavaScript)等库。
  • 整数运算:将小数转换为整数进行计算,最后再转换回小数。
  • 格式化输出:通过格式化控制小数位数,减少显示问题。