JavaScript、Java、C#精度丢失问题
1. IEEE 754 标准
- 二进制浮点数:IEEE 754 标准使用二进制表示浮点数,某些十进制小数无法精确转换为二进制,导致精度丢失。
- 有限位数:浮点数的位数有限,无法精确表示所有小数,尤其在涉及大数或小数时。
2. JavaScript 中的精度丢失
-
动态类型:JavaScript 只有一种数字类型
Number,采用双精度浮点数(64位),容易在计算中出现精度问题。 -
示例:
console.log(0.1 + 0.2); // 输出 0.30000000000000004
3. Java 和 C# 中的精度丢失
-
Java:
float(32位)和double(64位)也会出现类似问题。System.out.println(0.1 + 0.2); // 输出 0.30000000000000004 -
C# :
float和double同样存在精度问题。Console.WriteLine(0.1 + 0.2); // 输出 0.30000000000000004
4. 解决方案
- 高精度库:使用如
BigDecimal(Java)、decimal(C#)或BigNumber.js(JavaScript)等库。 - 整数运算:将小数转换为整数进行计算,最后再转换回小数。
- 格式化输出:通过格式化控制小数位数,减少显示问题。