js中两个小数相减,出现的多位小数

clipboard.png这个用js怎么解决,我们是金融公司,所以希望有好的解决方案,两个数同时放大也一样
clipboard.png

阅读 30.3k
19 个回答

解决方案就是别用js进行任何商业行为

js的数字世界你别猜,你猜来猜去也不会明白^^

图片描述

文档在这,祝你玩的愉快:numbers

同比扩大成整数相减再同比缩小

与金钱相关的计算请出门右转找后端,并且看到用float, double处理的请就地埋了(在此仅以java为例,应该用BigDecimal)。

反对所有“转成整数做完转回去”的答案。

首先,精度计算,尤其涉及钱的问题,乘100再除100并不能解决问题,例如0.58*100=57.99999
不仅限于JS,任何编程语言,只要是按照IEEE标准的浮点数(几乎所有语言),它的存储结构就限制了它做不到精度计算(顺带一提,相等的判断用==很多时候也是错的,标准的做法是a-b < 0.000001),换句话说,只要用了语言中的浮点数(JS里就是所有Number),就会丢精度

具体我不多做解释,贴一下鸟哥的科普文 => http://www.laruence.com/2013/03/26/2884.html

要正确地处理这个问题,唯一的途径就是不使用浮点数,而使用其他类型(比如字符串)来进行运算,评论中有人提的math.js可以通过选项来支持,背后封装的 https://github.com/MikeMcl/decimal.js/ 这个方案

console.log((18.6-8).toFixed(2));

输出:10.60
2代表保留位数。

最好是后端语言处理数字

后端也有同样的问题的,一般的解决方案是对结果做格式化,保留n位

金融的话,相关计算还是找后台解决比较稳妥。
float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。

javascript天生的浮点数机制注定它不应该用于需要精确计算的应用中,虽然有好的解决方案,当对于需要精确计算的建议还是交给后台(非nodejs)来完成。曾经有人用nodejs去做3D打印,结果你懂的。。。

js 中没有真正意义上的浮点类型吧!
js中的数值运算都会先转换成二进制,然后再进行运算。
由于有些小数在转换时会产生无限循环,所以........
如果用js使用浮点类型的运算,最简单就乘以一个N*10的倍数,最后再除(上面也有说)
具体的解释

证明 0.99999... = 1
cause: 0.99999... 9 = 0.99999... (10 -1 ) = 9.99999.. - 0.99999... = 9 = 1 * 9
so: 0.99999... = 1

如果不是金融的话,取一下小数位数吧

这些计算应该都是在后端.如果前端只是简单的计算展示,就保留 N 位小数吧.

这是任何语言都存在的,"浮点数的精度问题", 在其他语言里面都有一个高精度数学模块能够处理这类型的需求,比如php中的bc模块 js中,就量力而行吧, 手动的控制小数位

我的做法是转string,计算小数点位置,移除小数点,算术运算,添加小数点

那估计就只能用bigDecimal.js进行运算了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏