V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wslsq
V2EX  ›  JavaScript

请教一下 js 精度的问题

  •  
  •   wslsq · 2017-11-24 09:59:49 +08:00 · 3259 次点击
    这是一个创建于 2558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在做一个前端计算器

    关于 js 精度,网上教程大部分都是把小数处理成整数

    然而

    4246.77 * 100 = 4336.820000000001

    请问一下大家一般怎么处理

    26 条回复    2017-11-24 17:40:55 +08:00
    chairuosen
        1
    chairuosen  
       2017-11-24 10:06:46 +08:00
    把字符串里的点删了直接转 Number,然后通过点右边的长度判断倍数?
    domty
        2
    domty  
       2017-11-24 10:07:17 +08:00
    看你保留几位小数了呗
    比如保留两位小数就 乘 100 取整再除 100
    domty
        3
    domty  
       2017-11-24 10:07:56 +08:00
    @domty #2
    当然这种数不能太大,要考虑溢出问题
    wslsq
        4
    wslsq  
    OP
       2017-11-24 10:08:59 +08:00
    @domty #2 我现在就是乘 100 的过程中出问题了,真让人头大
    minyress
        5
    minyress  
       2017-11-24 10:09:09 +08:00   ❤️ 1
    (123.123456).toFixed(3)
    Mutoo
        6
    Mutoo  
       2017-11-24 10:09:32 +08:00   ❤️ 1
    1) 4246.77 * 100 = 424677.00000000006
    2) 小数处理成整数指的是 4246.77 表示成 424677 * 10^-2 而不是去计算 4246.77 * 100 因为前者本身就无法用 ISO754 浮点数精确表示。
    3) 此类问题应该使用高精度算法解决
    fundon
        7
    fundon  
       2017-11-24 10:09:51 +08:00   ❤️ 1
    hubert3
        8
    hubert3  
       2017-11-24 10:10:59 +08:00
    chrome 显示 4246.77 * 100 = 424677.00000000006
    yangehappy
        9
    yangehappy  
       2017-11-24 10:13:35 +08:00
    说一下场景吧
    wslsq
        10
    wslsq  
    OP
       2017-11-24 10:14:35 +08:00
    @hubert3 #8
    疏忽,写错,的确是 424677.00000000006
    autoxbc
        11
    autoxbc  
       2017-11-24 10:15:06 +08:00 via iPhone   ❤️ 2
    math.js ,不要自己硬写
    gyteng
        12
    gyteng  
       2017-11-24 10:16:55 +08:00
    注意 toFixed 也是有坑的
    wslsq
        13
    wslsq  
    OP
       2017-11-24 10:17:45 +08:00
    @yangehappy 一个电脑配件计算器,cpu 内存什么的

    @fundon 谢谢,伸手了
    @Mutoo 谢谢,1)是写错了。学习了~
    mooncakejs
        14
    mooncakejs  
       2017-11-24 10:22:58 +08:00
    说的好像别的语言没这个问题一样。
    wslsq
        15
    wslsq  
    OP
       2017-11-24 10:24:04 +08:00
    @mooncakejs 别的没这么酷炫,至少*100 基本没问题的。最近我也是前后端都搞。。
    谢谢大家 不一一回复了
    mooncakejs
        16
    mooncakejs  
       2017-11-24 10:30:51 +08:00
    @wslsq 常见的后端语言 c/c++,python,java 都这样,只不过 js 在前端更容易被注意到。
    alen
        17
    alen  
       2017-11-24 10:33:30 +08:00
    <img alt="" src=" ">
    hasbug
        18
    hasbug  
       2017-11-24 10:34:51 +08:00
    网上找别人的轮子来用。。我都这么解决,给力不
    lybtongji
        19
    lybtongji  
       2017-11-24 10:38:47 +08:00
    Firefox 显示正常
    Elven
        20
    Elven  
       2017-11-24 10:50:34 +08:00 via iPhone
    用现成的库呀,比如 math.js ,bn.js 什么的
    moe3000
        21
    moe3000  
       2017-11-24 10:51:07 +08:00
    toFixed 或者别人写的运算库
    wslsq
        22
    wslsq  
    OP
       2017-11-24 10:59:47 +08:00
    @moe3000
    @Elven
    @lybtongji
    @hasbug
    谢谢大家 不一一回复了
    rover5056
        24
    rover5056  
       2017-11-24 11:24:37 +08:00
    (*1000 +0.001)/1000
    自己想的办法 有点妖但是很好用
    rover5056
        25
    rover5056  
       2017-11-24 11:25:13 +08:00
    再 FIX 一下就好了
    yuriko
        26
    yuriko  
       2017-11-24 17:40:55 +08:00   ❤️ 1
    大多数语言都会有的问题,本质就是浮点数小数部分转成二进制会无限循环,再转换回来的时候丢失精度
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3329 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:44 · PVG 20:44 · LAX 04:44 · JFK 07:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.