避免 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 这个逆天设计,好像别的语言也有这样的
user2 • • 目录导航
第一反应精度丢失问题,转念想怎么会差这么多, 仔细一看,ceil ,你确定这不是设计如此有人贪这差值吗, |
user3 • • 目录导航
计算金融不要用二进制浮点数,二进制浮点数的设计就没法精确表示十进制有理数。用十进制浮点数或者定点数,因为金融业务很少用到分以下,用定点数的比较多。十进制浮点数的支持状态也不太好。 |
user1 • • 目录导航
biginit |
user2 • • 目录导航
“1.1” 是十进制,当这个值转为数字的时候是无限循环小数 1.0001100110011001100110011… |
user3 • • 目录导航
内部数据应该用分为单位的整数吧,显示的时候转换 |
user1 • • 目录导航
|
user2 • • 目录导航
|
user3 • • 目录导航
bignumber.js |
user1 • • 目录导航
凡是涉及金额,都不能简单计算。 |
user2 • • 目录导航
金额永远别用浮点数 用 decimal |
user3 • • 目录导航
二进制只能近似存储小数,详细重新学习 IEEE754 ,还有以前面试区分培训和科班第一个就让说 IEEE754 ,不知道的一定是培训出来的,因为培训班不会说什么浮点数底层怎么实现,而是会说金额不让用 double ,科班必定知道,计组第一章就是吧 |
user1 • • 目录导航
只用数据库计算 |
user2 • • 目录导航
string 或者整形存储,计算时得注意精度丢失问题 |
user3 • • 目录导航
" JS 这个逆天设计",很野的说法 |
user1 • • 目录导航
与其说语言的逆天设计,不如说只知道给金额用浮点数的程序员比较逆天吧。 |
user2 • • 目录导航
这个不是常见的面试题么,没见过嘛? |
user3 • • 目录导航
|
user1 • • 目录导航
测了下 1.1 * 100 == 110.00000000000001 向上取整所以是 111 没问题啊。。。 |
user2 • • 目录导航
|
基础没学好,回去重修。
—
解决方法就是钱永远别用小数。