谷歌Chrome计算器小数减法结果异常,请求排查原因及解决方法
我太懂这种困惑了——本来想偷懒用地址栏快速算个结果,结果出来一堆奇怪的小数,还以为是数据库出问题,折腾半天发现是Chrome的锅。咱们来拆解下这个问题:
核心原因:Chrome地址栏的计算器依赖JavaScript浮点数
Chrome地址栏的计算功能本质是调用了JavaScript的Number类型,而这种类型是双精度64位浮点数,它的特性就是无法精确表示所有十进制小数。比如你可能见过经典的0.1 + 0.2 = 0.30000000000000004,这和你遇到的情况完全是同一个原理:当你复制的多位小数无法用二进制浮点数精准存储时,运算后就会出现精度丢失的异常结果,和你用小数点还是其他分隔符、换测试案例无关——这是浮点数运算的固有局限,不是Chrome的设置问题,也不是你的操作失误。
解决办法
直接在SQL里完成运算:既然数值本来就在SQL数据库里,不如直接写SQL语句计算,比如:
SELECT your_column1 - your_column2 AS result FROM your_table WHERE ...SQL里的
DECIMAL/NUMERIC类型是专门为精确小数运算设计的,能完美避免浮点数精度问题,还省了复制粘贴的步骤。改用高精度计算器工具:如果非要在外部计算,别用Chrome地址栏,改用系统自带的科学计算器(Windows的计算器切换到“程序员”模式或者“科学”模式,Mac的计算器也有高精度选项),这些工具通常会用更精确的数值处理方式。
手动转换为整数运算(临时 workaround):如果临时要用Chrome,你可以把两个小数都乘以10的n次方(n是两个数的最大小数位数),转成整数相减后再除以10的n次方。比如计算
1.2345 - 0.6789,就先算12345 - 6789 = 5556,再除以10000得到0.5556,但这种方法需要手动数小数位数,比较麻烦,只适合临时用。
额外提醒
你一开始怀疑SQL数据库是很正常的,但其实SQL的精确数值类型是靠谱的,问题完全出在Chrome的浮点数运算机制上,所以不需要去修复数据库哦。
内容的提问来源于stack exchange,提问作者Hadi Kılınç

