Java简单类型进行精确浮点数运算

运算

由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入。

以下为代码:

import java.math.BigDecimal;

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();
}
}

时间: 2024-08-03 17:07:23

Java简单类型进行精确浮点数运算的相关文章

Java中使用BigDecimal进行浮点数运算_java

最近研究了一下Java的浮点数计算问题,从网上查询了相关的资料,汇总并经过了一些整理和调试,最后完成此文,欢迎大家指出其中的错误和问题. 在Java中,float声明的变量是单精度浮点数,double声明的变量是双精度浮点数,顾名思义就是double型的实体占用内存空间是float的两倍.float是4个字节而double是8个字节.float和double类型的数据,无法精确表示计算结果,这是由于float和double是不精确的计算.大家可以通过下面代码可以看出来: 复制代码 代码如下: p

java 简单的位运算

问题描述 java 简单的位运算 int i=0xaabbccdd : byte b1=0xdd: byte b2=0xcc: byte b3=0xbb: byte b4=0xaa: 使用位运算将i变为0xddccbbaa 解决方案 Java位运算Java位运算JAVA中的位运算 解决方案二: b1是不是0xdd? b1*16^6+b2*16^4+b3*16^2+b4

代码-java 简单的位运算

问题描述 java 简单的位运算 用位运算将int i=0xaabbccdd 变成 i=0xddccbbaa,我不知道自己写的代码哪里错了,希望各位可以指出,谢谢 解决方案 Java 位运算java 位运算Java 中的位运算 解决方案二: a1错了,应该是左移6位,即 <<64 解决方案三: a3也错了,应该是左移2位,即 <<4 解决方案四: 这是用c++编写的,最简单的程序.记得负数右移,补的是符号位. 解决方案五: t = (t1<<24)|(t2<<

java spring mvc-Spring mvc @requestBody 如何标注简单类型吗?如String

问题描述 Spring mvc @requestBody 如何标注简单类型吗?如String 前端json格式 { "userId": "2", } 后台接收程序 public ModelMap queryMyCoustomer( @RequestBody String userId,HttpServletRequest request,HttpServletResponse response) 结果匹配不到 userId 是不是 @RequestBody 只能接收

php中浮点数运算常见问题

本文实例分析了php中让人头疼的浮点数运算.分享给大家供大家参考,具体如下: 在做电商的时候,计算价格是免不了的,然后发现了php的一个坑,口算应该正确的值,php运算出来会跟你不一样 请看下面的代码: $price=69.1; $count=100; $total=$price*$count-6910; echo $total; 你猜一下变量$total的值是多少,运行一下这个代码输出:-9.09494701773E-13 怎么解决这个问题呢? 使用round函数 代码修改成: $price=

JavaScript 浮点数运算 精度问题_javascript技巧

Js代码 复制代码 代码如下: <script type="text/javascript" language="javascript"> alert(1/3);//弹出: 0.3333333333333333 alert(0.09999999 + 0.00000001);//弹出: 0.09999999999999999 alert(-0.09999999 - 0.00000001);//弹出: -0.09999999999999999 alert(0

java-Java用对象作为参数和用简单类型作为参数的效率差别有多大

问题描述 Java用对象作为参数和用简单类型作为参数的效率差别有多大 用简单类型作为参数就是把参数个数和类型写死,改动影响大,如果使用对象传参,就很灵活,但传递对象的效率会差一点,这两种方式该如何取舍? 解决方案 你自己都说了,后者灵活一些,难道你自己还不能取舍性能和灵活性么? 解决方案二: 既然用JAVA了,这点开销还计算在内?

Java变量类型间的相互转换

变量|转换 ????我们知道,Java的数据类型分为三大类,即布尔型.字符型和数值型,而其中数值型又分为整型和浮点型:相对于数据类型,Java的变量类型为布尔型boolean:字符型char:整型byte.short.int.long:浮点型float.double.其中四种整型变量和两种浮点型变量分别对应于不同的精度和范围.此外,我们还经常用到两种类变量,即String和Date.对于这些变量类型之间的相互转换在我们编程中经常要用到,在我们今天的这篇文章中,我们将来看看如何实现这些转换. ??

JAVA变量类型之间的相互转换

一. 整型.实型.字符型变量中的相互转换 在Java中整型.实型.字符型被视为同一类数据,这些类型由低级到高级分别为(byte,short,char)??int??long??float??double,低级变量可以直接转换为高级变量,例如,下面的语句可以在Java中直接通过: byte b; int i=b; 而将高级变量转换为低级变量时,情况会复杂一些,你可以使用强制类型转换.即你必须采用下面这种语句格式: int i; byte b=(byte)i; 可以想象,这种转换肯定可能会导致溢出或