推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
wslsq

请教一下 js 精度的问题

  •  
  •   wslsq · Nov 24, 2017 · 3898 views
    This topic created in 3096 days ago, the information mentioned may be changed or developed.

    最近在做一个前端计算器

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

    然而

    4246.77 * 100 = 4336.820000000001

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

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

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