JAVA 及 js 浮点数精确计算
2011-01-13 13:59
源文件Arith.java:
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
* 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class Arith{
//默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
//这个类不能实例化
private Arith(){
}
/**
* 提供精确的加法运算。
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1,double v2){
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
* 小数点以后10位,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1,double v2){
return div(v1,v2,DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
* 定精度,以后的数字四舍五入。
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1,double v2,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v,int scale){
if(scale<0){
throw new IllegalArgumentException(
"The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
};
--------------------------------------------js----------------------------------------------
/除法函数,用来得到精确的除法结果
//说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
//调用:accDiv(arg1,arg2)
//返回值:arg1除以arg2的精确结果
function accDiv(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);
}
}
//给Number类型增加一个div方法,调用起来更加方便。
Number.prototype.div = function (arg){
return accDiv(this, arg);
}
//乘法函数,用来得到精确的乘法结果
//说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
//调用:accMul(arg1,arg2)
//返回值:arg1乘以arg2的精确结果
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(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
}
//给Number类型增加一个mul方法,调用起来更加方便。
Number.prototype.mul = function (arg){
return accMul(arg, this);
}
//加法函数,用来得到精确的加法结果
//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
//调用:accAdd(arg1,arg2)
//返回值:arg1加上arg2的精确结果
function accAdd(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
}
//给Number类型增加一个add方法,调用起来更加方便。
Number.prototype.add = function (arg){
return accAdd(arg,this);
}
//减法函数,用来得到精确的减法结果
//说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。
//调用:accSubtr(arg1,arg2)
//返回值:arg1减去arg2的精确结果
function accSubtr(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);
}
//给Number类型增加一个subtr 方法,调用起来更加方便。
Number.prototype.subtr = function (arg){
return accSubtr(arg,this);
}
在你要用的地方包含这些函数,然后调用它来计算就可以了。
比如你要计算:7*0.8 ,则改成 (7).mul(8)
其它运算类似,就可以得到比较精确的结果。
相关推荐
在编程和计算机科学中,"四舍五入"是一个常见的概念,用于处理浮点数或小数,并将它们转换为最接近的整数。在这个场景中,标题"四舍五入_四舍五入问题_源码"暗示我们将讨论如何在编程中实现四舍五入操作,特别是与...
Math.round()函数是JavaScript中的一个内建函数,它的作用是将给定的小数四舍五入到最接近的整数。当小数部分小于0.5时,结果会向下取整,即去掉小数部分;而当小数部分大于或等于0.5时,结果会向上取整,即增加1到...
本文将介绍如何在JavaScript中保留浮点数的两位小数点,并采用四舍五入的方式实现这一需求。同时,也会提及JavaScript内置的`toFixed()`方法,它是实现四舍五入功能的一个简便方法。 首先,要了解在JavaScript中...
在JavaScript编程中,处理浮点数四舍五入的方法主要有两种,即Number对象的toFixed()方法和Math对象的round()方法。这两种方法虽然都能实现四舍五入的效果,但它们在四舍五入的规则和应用场景上存在一定的差异。 ...
这里涉及到的主要知识点是JavaScript中浮点数的四舍五入和特定格式化方法,以及如何利用JavaScript提供的功能实现这些常见的需求。 首先,我们需要了解JavaScript中的基本数学运算和类型转换。在JavaScript中,数字...
在JavaScript中,`toFixed()` 方法是用来处理浮点数精度问题的一种常见方式,它主要用于将一个数字转换为指定小数位数的字符串,并按照四舍五入的规则进行处理。然而,这里提到的是“银行家舍入”规则,实际上,`...
根据 IEEE 754 标准,有几种不同的舍入策略,如四舍五入、向零舍入、向上舍入和向无穷舍入等。选择合适的舍入策略以确保结果的精度。 4. **二进制到16进制转换**:将标准化后的二进制浮点数转换为16进制。这可以...
在JavaScript中,四舍五入问题常常出现在处理浮点数时,由于计算机内部表示浮点数的方式(基于二进制的IEEE 754标准)可能导致精度损失,从而造成四舍五入结果不符合预期。标题和描述中提到的“特殊数据的js四舍五入...
标题中的“保留浮点数的n位小数”指的是将浮点数四舍五入或截断到指定的小数位数。这通常涉及到数字的字符串格式化或者使用数学库中的特定函数来实现。下面我们将详细探讨如何在不同编程语言中实现这一功能。 1. **...
这个方法的基本思路是先将数字扩大一定倍数,然后进行四舍五入,最后再缩小相同倍数。具体实现如下: ```javascript function round(num, d) { // Step1: 将num放大10的d次方倍 num *= Math.pow(10, d); // ...
“js奇进偶舍”是一种自定义的舍入方法,该方法基于奇数和偶数的特性来进行四舍五入操作,适用于需要精确控制数字精度的场景。 #### 代码解析与应用 本节将详细解析提供的代码,并解释其工作原理和应用场景。 ###...
1. **四舍五入**:确定保留的小数位数,可以使用`toFixed()`方法。例如,`num.toFixed(2)`会将数字四舍五入到最接近的两位小数。 2. **千位分隔**:对于大数字,为了提高可读性,我们可能需要添加千位分隔符。...
4. **四舍五入**:提供更精确的四舍五入方法,如按照指定的小数位数进行四舍五入,或者根据特定策略决定如何舍入。 5. **格式化输出**:为了方便输出和展示,可能包括了将浮点数转换为字符串的方法,可以控制小数点...
- 这一步的目的是根据需要保留的小数位数调整乘数,以便在接下来的步骤中进行正确的四舍五入。 3. **进行四舍五入**: - 使用 `Math.round` 函数对 `v * t` 的结果进行四舍五入处理。 - 最后将结果除以 `t`,...
但要注意,这种方法会四舍五入,可能改变数值的原始精度。 2. **使用Math对象的方法**:虽然Math对象的一些方法(如`Math.floor()`、`Math.ceil()`、`Math.round()`)不能解决精度问题,但`Math.pow()`可以用来避免...
同时,它可能还支持大数的四舍五入、舍去尾数等处理,以满足各种复杂的计算需求。 `mathcontext2.js`文件很可能是一个类似于Java的`MathContext`类,它用于定义计算的精度和舍入模式。在进行高精度计算时,设置合适...
5. **舍入模式**:Decimal.js提供了多种舍入模式,如ROUND_UP(向上)、ROUND_DOWN(向下)、ROUND_HALF_UP(四舍五入)等,可以根据需求调整舍入策略。 6. **静态方法与实例方法**:Decimal.js既提供了静态方法,...
例如,你可以设置小数点后的位数,以及在舍入时遵循的策略(比如四舍五入、向下取整等)。 4. **自定义工具类**:`js常用类v2.4.js`可能是开发者自定义的一组工具函数,其中可能包含了处理大数运算的函数。这些工具...