关于JS浮点数运算不精确的原因和解决方案
背景
之前在一个项目中,涉及到了金额,协议组定的标准是按照分的单位进行传递的,但是交互上,web页面中为了更友好的体验,是使用的元作为单位的,这个时候就需要转换一下单位。
本来是很简单的一个转化的需求,在和后端联调的时候发现,保存的时候返回了参数错误,原因就是由于js浮点数精度带来的影响,导致保存的时候保存的位数特别多。
之前的开发过程中,对这个不精确的问题只是了解,有问题了就parseInt一下,但没有去细想过要怎么解决,所以今天整理了一下之后分享一下,先了解下原因,再看下怎么解决和规避
问题
输入金额 0.55,我传递之后应该乘 100 后下发,正常来说应该传的是55,但是实际上,由于精度丢失,最后的结果如下图所示:
那追根溯源,到底为什么会产生精度丢失的问题呢?
计算机底层只有0 和 1, 所以所有的运算最后实际上都是二进制运算。十进制整数利用辗转相除的方法可以准确地转换为二进制数,但浮点数呢?
先看下面一张图,是关于IEEE 754标准(IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号):