1
rrfeng 16 小时 36 分钟前 via Android 3
基础没学好,回去重修。
--- 解决方法就是钱永远别用小数。 |
2
AoEiuV020JP 16 小时 32 分钟前 2
第一反应精度丢失问题,转念想怎么会差这么多, 仔细一看,ceil ,你确定这不是设计如此有人贪这差值吗,
|
3
Coelacanthus 16 小时 31 分钟前
计算金融不要用二进制浮点数,二进制浮点数的设计就没法精确表示十进制有理数。用十进制浮点数或者定点数,因为金融业务很少用到分以下,用定点数的比较多。十进制浮点数的支持状态也不太好。
|
4
TomVista 16 小时 28 分钟前
biginit
|
5
icyalala 16 小时 13 分钟前 1
"1.1" 是十进制,当这个值转为数字的时候是无限循环小数 1.0001100110011001100110011...
舍入后就是 1.0001100110011001100110011001100110011001100110011010, 注意最后一位是向上舍入的。 所以最开始从 "1.1" 这个字符串解析到数字的时候就已经不准确了。 属实是计算机基础不扎实。 |
6
pinocc012 16 小时 0 分钟前
内部数据应该用分为单位的整数吧,显示的时候转换
|
7
c8c 15 小时 58 分钟前
`npm install decimal.js`
|
8
xiangyuecn 15 小时 17 分钟前
|
9
chobitssp 15 小时 16 分钟前
bignumber.js
|
10
cmdOptionKana 15 小时 6 分钟前
凡是涉及金额,都不能简单计算。
一个金额,一个日期,这两个是很典型新手误区,表面上看起来没什么,实际上都藏着大坑。 |
11
haolongsun 14 小时 52 分钟前
金额永远别用浮点数 用 decimal
|
12
haolongsun 14 小时 48 分钟前
二进制只能近似存储小数,详细重新学习 IEEE754 ,还有以前面试区分培训和科班第一个就让说 IEEE754 ,不知道的一定是培训出来的,因为培训班不会说什么浮点数底层怎么实现,而是会说金额不让用 double ,科班必定知道,计组第一章就是吧
|
13
importmeta 14 小时 41 分钟前
只用数据库计算
|
14
fiveStarLaoliang 14 小时 37 分钟前
string 或者整形存储,计算时得注意精度丢失问题
|
15
iOCZS 14 小时 23 分钟前 1
" JS 这个逆天设计",很野的说法
|
16
msg7086 14 小时 15 分钟前
与其说语言的逆天设计,不如说只知道给金额用浮点数的程序员比较逆天吧。
|
17
IvanLi127 14 小时 7 分钟前
这个不是常见的面试题么,没见过嘛?
改用 Decimal.js 吧。https://www.npmjs.com/package/decimal.js/v/10.4.3 其他语言也有类似的库,推荐直接用这种方案来做计算。 |
18
masterclock 13 小时 20 分钟前 3
|
19
est 12 小时 34 分钟前
测了下 1.1 * 100 == 110.00000000000001 向上取整所以是 111 没问题啊。。。
问题在于 LZ 你为啥要向上取整啊。。round 不行么。 |
20
drymonfidelia OP @est 因为商品价格 100 美元,税 10%,业务需求是向上取整到整数
|
21
DOLLOR 11 小时 23 分钟前
浮点运算你换什么语言都一样。
涉及财务、金融的计算,*不能用浮点数*,要用*定点数*,这应该是程序员的常识、共识。 |
22
ntedshen 11 小时 17 分钟前
“业务需求是向上取整到整数”?
简单, Math.ceil(Math.round(1.1*10000)/100) 然后下一届码农:md 屎山+1 (狗头 |
23
drymonfidelia OP @ntedshen 我真的改成了这样 (狗头
|
24
mingl0280 7 小时 51 分钟前
涉及钱币为什么要用浮点数?
|
26
geelaw 7 小时 10 分钟前 via iPhone
@drymonfidelia #20 正确的做法是金额存成 cPrice = 10000 美分,税计算为 ((cPrice * 10000 * bpTaxRate - 1) / 10000 + 1) 美分,其中 bpTaxRate 是税率的基点数(万分之几)。这里假设 cPrice 是非负数(销售),处理退款更麻烦。
|
28
whileFalse 6 小时 37 分钟前 via Android
lz 培训班的,鉴定完毕
|
29
lovestudykid 6 小时 24 分钟前
计算机就业状况还是太好了
|
30
lithiumii 2 小时 3 分钟前 via Android
ceil 是上取整,你就算是不懂浮点数,用四舍五入这个 bug 也会少很多
|
31
lee88688 1 小时 8 分钟前
#22 的做法其实是正确的,不算什么屎山。使用二进制浮点数表示十进制浮点数在一定有效位数下可以认为是正确的,这个有效位数在 64 位浮点数下大概是 12 位。
在这些位数下转换成整数,然后将整数和小数部分取出来做处理完全没问题,楼主只需要写一些注释,后续人理解没问题的。 |
32
lee88688 1 小时 4 分钟前
多说一句,这种是将浮点数进行最终处理和简单时的做法。因为这些误差在累积计算的时候可能会让偏差越来越大,因此计算的时候还是使用浮点数需要做额外的处理,最好还是使用十进制的库计算或者用 bigint 转化为整数计算。
|