前言
在最近业务开发中, 作者偶遇到了一个与 JavaScript 浮点数相关的 Bug。
这里就简单描述下背景: 在提现相关业务时, 会将展示给用户以元为单位的数值转化为以分为单位的数值。...在JS中, 无论整数还是小数都是Number类型, 它的实现遵循IEEE 754, 是标准的Double双精度浮点数, 使用固定的64位来表示。
看到这里你可能就不想看下去了。...阅读完上面一节, 对小数的乘法我们也可以有一些自己的猜测了。
0.57这个数值在存储时, 本身的精度不是很准确, 我们用toPrecision这个方法可以获取小数的精度。...而此时, 路总问了我一个问题, 为什么0.57 * 1000 === 570 而不是 569.99999..., 不求甚解的我只能先回答"应该是精度丢失吧"
然而, 我"小小的眼睛里充满了大大的疑惑"....例如本文最初遇到的BUG
const value = Math.round(0.57 * 100);
而我们不太确定精度的浮点数运算, 通用的解决方案都是将小数转化为整数, 进行计算后, 再转化为小数就好了