关于精度丢失问题

在做进销存时,遇到精度丢失的问题,就记一下

在JavaScript里,如果你认为0.1+0.2会等于0.3,你就错了,答案是0.30000000000000004

计算机的二进制实现和位数限制有些数无法有限表示

就像一些无理数不能有限表示,如 圆周率 3.1415926... 

此时只能模仿十进制进行四舍五入了,但是二进制只有 0 和 1 两个,于是变为 0 舍 1 入

这即是计算机中部分浮点数运算时出现误差,丢失精度的根本原因

那要怎么解决呢

思路的话是转变成整数去处理,之后再还原成小数

整数只要运算结果不超过 Math.pow(2, 53) 就不会丢失精度

复制代码
//加or减  减的话相当加一个负数
function add(n1, n2) {
    var s1, s2, m;
    try {
        s1 = n1.toString().split(".")[1].length;
    } catch (e) {
        s1 = 0;
    }
    try {
        s2 = n2.toString().split(".")[1].length;
    } catch (e) {
        s2 = 0;
    }
    m = Math.pow(10, Math.max(s1, s2));
    return (n1 * m + n2 * m) / m;
}
//
function ride(arg1, arg2) {
    if (arg1 == null || arg2 == null) {
        return null;
    }
    var n1, n2;
    var r1, r2; // 小数位数
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    n1 = Number(arg1.toString().replace(".", ""));
    n2 = Number(arg2.toString().replace(".", ""));
    return n1 * n2 / Math.pow(10, r1 + r2);
}
//
function except(arg1, arg2) {
    if (arg1 == null) {
        return null;
    }
    if (arg2 == null || arg2 == 0) {
        return null;
    }
    var n1, n2;
    var r1, r2; // 小数位数
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    n1 = Number(arg1.toString().replace(".", ""));
    n2 = Number(arg2.toString().replace(".", ""));
    return (n1 / n2) * Math.pow(10, r2 - r1);
}
复制代码
posted @   Pavetr  阅读(444)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示