JavaScript浮点运算,小数点精度

math.js


// JavaScript Document
//数学函数
// 浮点数加法运算
function floatAdd(arg1, arg2) {
    var r1, r2, m;
    try{
        r1 = arg1.toString().split(".")[1].length;
    } catch(e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch(e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return (arg1 * m + arg2 * m) / m;
}

// 浮点数减法运算
function floatSub(arg1, arg2) {
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch(e) {
        r1 = 0
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch(e) {
        r2 = 0
    }
    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
}

// 浮点数乘法运算
function floatMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
    } catch(e) {}
    try {
        m += s2.split(".")[1].length;
    } catch(e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

// 浮点数除法运算
function floatDiv(arg1, arg2) {
    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    } catch(e) {}
    try {
        t2 = arg2.toString().split(".")[1].length;
    } catch(e) {}
    with(Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return (r1 / r2) * pow(10, t2 - t1);
    }
}
// 设置数值精度
function setScale(value, scale, roundingMode) {
    if (roundingMode.toLowerCase() == "roundhalfup") {
        return (Math.round(value * Math.pow(10, scale)) / Math.pow(10, scale)).toFixed(scale);
    } else if (roundingMode.toLowerCase() == "roundup") {
        return (Math.ceil(value * Math.pow(10, scale)) / Math.pow(10, scale)).toFixed(scale);
    } else {
        return (Math.floor(value * Math.pow(10, scale)) / Math.pow(10, scale)).toFixed(scale);
    }
}   

原文地址:https://www.cnblogs.com/thatme/p/10208273.html

时间: 2024-08-30 14:40:27

JavaScript浮点运算,小数点精度的相关文章

关于JavaScript中计算精度丢失的问题

摘要: 由于计算机是用二进制来存储和处理数字,不能精确表示浮点数,而JavaScript中没有相应的封装类来处理浮点数运算,直接计算会导致运算精度丢失. 为了避免产生精度差异,把需要计算的数字升级(乘以10的n次幂)成计算机能够精确识别的整数,等计算完毕再降级(除以10的n次幂),这是大部分编程语言处理精度差异的通用方法. 关键词: 计算精度 四舍五入 四则运算 精度丢失 1. 疑惑 我们知道,几乎每种编程语言都提供了适合货币计算的类.例如C#提供了decimal,Java提供了BigDecim

javascript(js)小数精度丢失的解决方案

原因:js按照2进制来处理小数的加减乘除,在arg1的基础上 将arg2的精度进行扩展或逆扩展匹配,所以会出现如下情况. javascript(js)的小数点加减乘除问题,是一个js的bug如0.3*1 = 0.2999999999等,下面列出可以完美求出相应精度的四种js算法 function accDiv(arg1,arg2){ var t1=0,t2=0,r1,r2; try{t1=arg1.toString().split(".")[1].length}catch(e){} t

JavaScript 浮点数运算 精度问题

JavaScript小数在做四则运算时,精度会丢失,这会在项目中引起诸多不便,先请看下面脚本. 1 //加减 2 <script type="text/javascript" language="javascript"> 3 alert(1/3);//弹出: 0.3333333333333333 4 alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 5 alert(-0.09999999 -

【Python】关于Python里面小数点精度控制的问题

基础 浮点数是用机器上浮点数的本机双精度(64 bit)表示的.提供大约17位的精度和范围从-308到308的指数.和C语言里面的double类型相同.Python不支持32bit的单精度浮点数.如果程序需要精确控制区间和数字精度,可以考虑使用numpy扩展库. Python 3.X对于浮点数默认的是提供17位数字的精度. 关于单精度和双精度的通俗解释: 单精度型和双精度型,其类型说明符为float 单精度说明符,double 双精度说明符.在Turbo C中单精度型占4个字节(32位)内存空间

关于numpy中的函数return中加入字符串类型数据后,小数点精度变化

weekdays.pyimport numpy as npfrom datetime import datetimedef datestr2num(s): return datetime.strptime(s.decode('ascii'), "%d-%m-%Y").date().weekday() dates, open, high, low, close=np.loadtxt('data.csv', dtype=float, delimiter=',', usecols=(1, 3

javascript 浮点运算

<script type="text/javascript"> // 两个浮点数求和 function accAdd(num1,num2){ var r1,r2,m; try{ r1 = num1.toString().split('.')[1].length; }catch(e){ r1 = 0; } try{ r2=num2.toString().split(".")[1].length; }catch(e){ r2=0; } m=Math.pow(

重写javascript浮点运算

javascript中变量存储时不区分number和float类型,同一按照float存储; javascript使用IEEE 754-2008标准定义的64bit浮点格式存储number,decimal64对应的整形部分长度为10,小树部分长度为16; javascript做小数点运算会出现不精准. //加法运算 var accAdd = function(num1,num2){ var n1,n2,m; try{ n1 = num1.toString().split(".")[1]

JavaScript浮点运算的问题 (乘法)

<script type="text/javascript"> var get_b_val_final=accMul(get_b_val,100)+"%"; function accMul(arg1,arg2){ var m=0,s1=arg1.toString(),s2=arg2.toString(); try{m+=s1.split(".")[1].length}catch(e){} try{m+=s2.split(".

knime 设置 小数点精度

kinme 默认小数精度是保留三位小数. 如果0.0003,knime会自动舍弃,读出0.下面步骤教你怎么把小数精度全部显示. File->references->preferred rederers ->Basic- Number(double)->Full Precision -> OK 原文地址:https://www.cnblogs.com/Jesse-Li/p/10256831.html