避免 Math.ceil(1.1 * 100) == 111 的最佳实践是什么?用户支付金额不对不能入账,排查了半天才发现 JS 这个逆天设计,好像别的语言也有这样的
- 撤销(Ctrl+Z)
- 重做(Ctrl+Y)
- 清空
- H 标题(Ctrl+1~6)
- 一级标题
- 二级标题
- 三级标题
- 四级标题
- 五级标题
- 六级标题
- 插入提示
- 提示
- 注意
- 警告
- 详细信息
- 粗体(Ctrl+B)
- 斜体(Ctrl+I)
- 删除线
- 插入引用(Ctrl+Q)
- 无序列表(Ctrl+U)
- 有序列表(Ctrl+O)
- 表格
- 插入分割线
- 插入链接(Ctrl+L)
- 插入图片
- 添加图片链接
- 插入代码块
- 关闭同步滚动
- 全屏(按ESC还原)
- 开启预览
避免 Math.ceil(1.1 * 100) == 111 的最佳实践是什么?用户支付金额不对不能入账,排查了半天才发现 JS 这个逆天设计,好像别的语言也有这样的
避免 Math.ceil(1.1 * 100) == 111 的最佳实践是什么?用户支付金额不对不能入账,排查了半天才发现 JS 这个逆天设计,好像别的语言也有这样的
user1 • • 目录导航
“业务需求是向上取整到整数”? |
user3 • • 目录导航
涉及钱币为什么要用浮点数? |
user1 • • 目录导航
|
user2 • • 目录导航
@drymonfidelia #20 正确的做法是金额存成 cPrice = 10000 美分,税计算为 ((cPrice * 10000 * bpTaxRate - 1) / 10000 + 1) 美分,其中 bpTaxRate 是税率的基点数(万分之几)。这里假设 cPrice 是非负数(销售),处理退款更麻烦。 |
user3 • • 目录导航
|
user1 • • 目录导航
lz 培训班的,鉴定完毕 |
user2 • • 目录导航
计算机就业状况还是太好了 |
user3 • • 目录导航
ceil 是上取整,你就算是不懂浮点数,用四舍五入这个 bug 也会少很多 |
user1 • • 目录导航
#22 的做法其实是正确的,不算什么屎山。使用二进制浮点数表示十进制浮点数在一定有效位数下可以认为是正确的,这个有效位数在 64 位浮点数下大概是 12 位。 |
user2 • • 目录导航
多说一句,这种是将浮点数进行最终处理和简单时的做法。因为这些误差在累积计算的时候可能会让偏差越来越大,因此计算的时候还是使用浮点数需要做额外的处理,最好还是使用十进制的库计算或者用 bigint 转化为整数计算。 |
user3 • • 目录导航
如 #8 所说,去看看这个网站: |
user1 • • 目录导航
这是 IEEE754 的问题,金额相关不要用浮点数,要么使用 Decimal ,要么浮点数拆开成两个整数分开存储 |
user2 • • 目录导航
采用 IEEE 754 浮点数运算的标准的语言 都会出现这个问题,包括 JavaScript Java Python 等 |
user3 • • 目录导航
你不该说逆天设计,不是找喷吗。 |
user1 • • 目录导航
npm install mathjs -S |
user2 • • 目录导航
0.1+0.2==0.3 ? |
user3 • • 目录导航
判断 0.1+0.2==0.3 的正确用法应该是 abs(0.1+0.2-0.3)<0.000001 ,具体在小数点后多少位取决于你对精度的要求 |
user1 • • 目录导航
有点不理解 lz 这个代码是前端还是后端?如果是后端,从数据库设计开始就肯定用整数保存金额啊,包括银行也是这样。 |
浮点运算你换什么语言都一样。
涉及财务、金融的计算,不能用浮点数,要用定点数,这应该是程序员的常识、共识。