最近在做一个前端计算器
关于 js 精度,网上教程大部分都是把小数处理成整数
然而
4246.77 * 100 = 4336.820000000001
请问一下大家一般怎么处理
![]() | 1 chairuosen 2017-11-24 10:06:46 +08:00 把字符串里的点删了直接转 Number,然后通过点右边的长度判断倍数? |
![]() | 2 domty 2017-11-24 10:07:17 +08:00 看你保留几位小数了呗 比如保留两位小数就 乘 100 取整再除 100 |
5 minyress 2017-11-24 10:09:09 +08:00 ![]() (123.123456).toFixed(3) |
![]() | 6 Mutoo 2017-11-24 10:09:32 +08:00 ![]() 1) 4246.77 * 100 = 424677.00000000006 2) 小数处理成整数指的是 4246.77 表示成 424677 * 10^-2 而不是去计算 4246.77 * 100 因为前者本身就无法用 ISO754 浮点数精确表示。 3) 此类问题应该使用高精度算法解决 |
![]() | 7 fundon 2017-11-24 10:09:51 +08:00 ![]() |
![]() | 8 hubert3 2017-11-24 10:10:59 +08:00 chrome 显示 4246.77 * 100 = 424677.00000000006 |
9 yangehappy 2017-11-24 10:13:35 +08:00 说一下场景吧 |
![]() | 11 autoxbc 2017-11-24 10:15:06 +08:00 via iPhone ![]() math.js ,不要自己硬写 |
![]() | 12 gyteng 2017-11-24 10:16:55 +08:00 注意 toFixed 也是有坑的 |
![]() | 13 wlsq OP |
14 mooncakejs 2017-11-24 10:22:58 +08:00 说的好像别的语言没这个问题一样。 |
![]() | 15 wslsq OP @mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。 谢谢大家 不一一回复了 |
16 mooncakejs 2017-11-24 10:30:51 +08:00 @wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。 |
![]() | 17 alen 2017-11-24 10:33:30 +08:00 <img alt="" src=" ![]() |
![]() | 18 hasbug 2017-11-24 10:34:51 +08:00 网上找别人的轮子来用。。我都这么解决,给力不 |
![]() | 19 lybtongji 2017-11-24 10:38:47 +08:00 Firefox 显示正常 |
![]() | 20 Elven 2017-11-24 10:50:34 +08:00 via iPhone 用现成的库呀,比如 math.js ,bn.js 什么的 |
![]() | 21 moe3000 2017-11-24 10:51:07 +08:00 toFixed 或者别人写的运算库 |
![]() | 23 zproo 2017-11-24 11:21:12 +08:00 |
![]() | 24 rover5056 2017-11-24 11:24:37 +08:00 (*1000 +0.001)/1000 自己想的办法 有点妖但是很好用 |
![]() | 25 rover5056 2017-11-24 11:25:13 +08:00 再 FIX 一下就好了 |
26 yuriko 2017-11-24 17:40:55 +08:00 ![]() 大多数语言都会有的问题,本质就是浮点数小数部分转成二进制会无限循环,再转换回来的时候丢失精度 |