浮点型计算如何确定精度
来源:互联网 发布:java api 知乎 编辑:程序博客网 时间:2024/04/28 09:32
java里面浮点型包括2类:float 、double,下面看下例子:
对比一下“(2.4 - 0.2) / 0.1”和“(2.4 - 0.3) / 0.1”,前者结果是“21.999999999999996”,后者结果是“21.0”,计算结果都不是精确的,看了一些文章才知道浮点型是用于科学计算或者工程计算的,在商业计算中要用java.math.BigDecimal:如图
如果我们要做一个浮点型数据的加法运算,需要先将两个浮点数转为String型数据,然后用 BigDecimal(String value)构造成BigDecimal,之后要在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮 点数,每次都这样计算有点麻烦了,下面给大家提供下封装好的方法,以后直接调用就相当eazy了,哈哈
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(); }};
转载请注明本文出自Alex老夫子的博客(http://blog.csdn.net/msn465780),谢谢支持!
0 0
- 浮点型计算如何确定精度
- Java中如何确定浮点数的精度(摘)
- 浮点数精度计算
- 如何确定精度
- 浮点数计算精度控制
- 在Java中如何确定浮点数的精度,以及格式化(地域化)
- 在Java中如何确定浮点数的精度,例如按要求确定小数点后面的数字个数
- 在Java中如何确定浮点数的精度,例如按要求确定小数点后面的数字个数
- Java数值避免浮点型计算丢失精度问题
- 浮点型精度分析
- JS浮点计算时精度解决办法
- 浮点数据的精度计算和验证
- 浮点数计算注意精度问题
- Java浮点数计算精度问题总结
- JAVA中如何对double或者float的浮点数进行精度计算
- JAVA中如何对double或者float的浮点数进行精度计算
- 在Java中确定浮点数的精度
- 单精度与双精度浮点型
- Python脚本02 —— 删除以@3x.png为后缀的文件
- 一千行MySQL学习笔记(十二)
- ITMS-90535
- Android4.4.2配置修改记录
- svn
- 浮点型计算如何确定精度
- 希赛软考视频总结
- Python脚本03 —— 把文件名中的guan-替换成orp
- ITMS-90535
- JDK源码阅读之HashMap类
- 【开源访谈】Kingshard 作者陈非访谈实录【项目简介】 Kingshard 是一个由Go开发高性能MySQL Proxy项目,kingshard在满足基本的读写分离的功能上,致力于简化MySQ
- Python脚本04 —— 模板中字体统一改成font1、font2、font3、font4、font5、font6
- FOJ 2020 组合(组合数取素数摸模板:Lucas)
- 产品玩法全颠覆 联想new glass落地体现联想可穿戴战略精髓