zoukankan      html  css  js  c++  java
  • js double 精度损失 bugs

    bug图示:

    const arr = [
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01
    ];
    
    // [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    
    arr.reduce((acc, i) => acc += i);
    // 0.09999999999999999

    arr = [
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01
    ]
    (10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    
    arr.reduce((acc, i) => acc += i);
    0.09999999999999999
    
    sum = 0;
    0
    sum += 0.01;
    0.01
    sum += 0.01;
    0.02
    sum += 0.01;
    0.03
    sum += 0.01;
    0.04
    sum += 0.01;
    0.05
    sum += 0.01;
    0.060000000000000005
    sum += 0.01;
    0.07
    sum += 0.01;
    0.08
    sum += 0.01;
    0.09
    sum += 0.01;
    0.09999999999999999
    
    // 保留两位精度 ?

    解决方案

    1. string 大数相加 / 大数相乘

    arr = [
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01
    ];
    (10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    
    arr.reduce((acc, i) => acc += Number.parseFloat(i).toFixed(2));
    "0.010.010.010.010.010.010.010.010.010.01"
    
    arr.reduce((acc, i) => acc += parseFloat(i.toFixed(2)));
    0.09999999999999999
    
    arr.reduce((acc, i) => acc += i.toFixed(2));
    "0.010.010.010.010.010.010.010.010.010.01"
    
    arr.map(i => i.toFixed(2));
    (10) ["0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01", "0.01"]
    
    // string 大数相加, ??? 位运算
    1. 小数转整数
    arr = [
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01, 0.01, 0.01,
      0.01
    ];
    (10) [0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01]
    arr.map(i => i * 100).reduce((acc, i) => acc += i) / 100;
    0.1

    红包算法

    refs

    最简单的方法实现微信红包的随机算法

    https://www.cnblogs.com/xgqfrms/p/13688375.html

    ES6 ...rest

    const arr = [
         2.48, 13.77,  8.64,
        20.17,  8.94,  8.07,
        12.05,  5.71, 17.54,
         2.63
      ];
    // (10) [2.48, 13.77, 8.64, 20.17, 8.94, 8.07, 12.05, 5.71, 17.54, 2.63]
    
    const [min, ...rest1] = arr.sort((a, b) => a - b > 0 ? 1 : -1);
    // (10) [2.48, 2.63, 5.71, 8.07, 8.64, 8.94, 12.05, 13.77, 17.54, 20.17]
    
    min;
    // 2.48
    
    const [max, ...rest2] = arr.sort((a, b) => a - b > 0 ? -1 : 1);
    // (10) [20.17, 17.54, 13.77, 12.05, 8.94, 8.64, 8.07, 5.71, 2.63, 2.48]
    
    max;
    // 20.17
  • 相关阅读:
    poj 1743 Musical Theme 后缀数组
    poj 1743 Musical Theme 后缀数组
    cf 432D Prefixes and Suffixes kmp
    cf 432D Prefixes and Suffixes kmp
    hdu Data Structure? 线段树
    关于position和anchorPoint之间的关系
    ios POST 信息
    CALayers的代码示例
    CALayers详解
    ios中得sqlite使用基础
  • 原文地址:https://www.cnblogs.com/wheatCatcher/p/13733028.html
Copyright © 2011-2022 走看看