double类型数据做加和操作时会丢失精度问题处理
double类型的数据做加和操作 时会丢失精度,如下操作结果为:
int a = 3;
double b = 0.03;
double c = 0.03;
double d = a + b + c;
System.out.println("first d:" + d);
结果:first d:3.0599999999999996
如果用java.math包中的BigDecima类并用String来构造加和操作则结果会保持正确。操作如下:
public class TestBigDecimalDemo {
/**
* 测试BigDecimal 在进行算数计算时不会丢失精度。--一般的数值类型在进行 金融类数据计算时会丢失精度。
* @param args
*/
public static void main(String[] args) {
// double result = add(1.00000000000000001, 1.00000000000000001);
// //result = 2.0 丢失了精度
// System.out.println(result);
int a = 3;
double b = 0.03;
double c = 0.03;
//不会丢失精度
double d = add(add(a, b),c);
System.out.println("first d:" + d);
//会丢失精度
d = a+b+c;
System.out.println("second d:" + d);
}
/**
* 加法运算
* @param m1
* @param m2
* @return
*/
public static double add(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.add(p2).doubleValue();
}
/**
* 减法运算
* @param m1
* @param m2
* @return
*/
public static double sub(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.subtract(p2).doubleValue();
}
/**
* 乘法运算
* @param m1
* @param m2
* @return
*/
public static double mul(double m1, double m2) {
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.multiply(p2).doubleValue();
}
/**
* 除法运算
* @param m1
* @param m2
* @param scale
* @return
*/
public static double div(double m1, double m2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("Parameter error");
}
BigDecimal p1 = new BigDecimal(Double.toString(m1));
BigDecimal p2 = new BigDecimal(Double.toString(m2));
return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
输出结果为:3.06
double类型数据做加和操作时会丢失精度问题处理相关推荐
- android double值排序,android根据Double类型数据经纬度算出距离再根据距离实现排序功能...
前言 项目中用到全国的加油站数据加载 并根据经纬度算出距离 然后根据距离从小到大排序 主要是数据类型是Double 这里必须对数据进行封装 实现也不难 这里讲一下自己的实现方法和实现思路 效果图 先来 ...
- Java学习之double类型数据比较
Java学习之double类型数据比较 对于两个double类型的数据,是不能直接用==来比较是否相等 double a=1.01; double b=1.01; if(b==a){System.ou ...
- 深入理解C++浮点数(float、double)类型数据比较、相等判断
深入理解C++浮点数(float.double)类型数据比较.相等判断 浮点数在内存中的存储机制和整型数不同,其有舍入误差,在计算机中用近似表示任意某个实数.具体的说,这个实数由一个整数或定点数(即尾 ...
- 7-7 硬币找钱问题 (10 分)(思路+详解+double类型数据的处理)Come baby!!!!!!!!!!!!!!!!!!!!
一:题目 设有6 种不同面值的硬币,各硬币的面值分别为5 分,1 角,2 角,5 角,1 元,2元.现要用这些面值的硬币来购物.在购物中希望使用最少个数硬币.例如,1 次购物需要付款0.55 元,如果 ...
- VS Code写C语言输出long double类型数据不正确的问题
VS Code写C语言输出long double类型数据不正确的问题 在学习<C Primer Plus>一书时遇到一个例题 #include <stdio.h>int mai ...
- java double 类型_关于Java中的double类型数据
在初学Java的时候,一般我们都会从基本的数据类型开始学习,而在基本数据类型中,我认为double类型是比较难理解的,并且在以后的学习或工作中,在double类型数据这遇到的坑也是极多的.例如下面的这 ...
- c语言中数据精度发生错误,C语言Double类型数据保证精度有关问题
C语言Double类型数据保证精度问题 我用手算算出的数据为-1.35323517,但是在C语言里面为了保证数据精度,VC++运行的结果为-1.35323517024517 ,按说应该在-1.3532 ...
- C语言double数据加减,double类型数据的加减乘除
import java.math.BigDecimal; /** * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入. */ public ...
- mysql的double类型数据_mysql数据类型double和decimal区别详解
实数是带有小数部分的数字.然而,它们不只是为了存储小数部分,也可以使用 DEClMAL 存储比 BIGINT还大的整数. MySQL 既支持精确类型,也支持不精确类型. FLOAT 和 DOUBLE ...
最新文章
- python数据结构与算法:单向链表
- Hinton最新专访:别让AI解释自己,AI寒冬不会再来
- [bzoj3625][Codeforces 250 E]The Child and Binary Tree(生成函数+多项式运算+FFT)
- showmount -e (CVE-1999-0554) NFS漏洞解决方案
- python + opencv: kalman 跟踪
- 测试工作笔记001---web测试_工作经验_注意点_随时更新
- 可以用AppleWatch解鎖iPhone
- Java的BIO,NIO和AIO的区别于演进
- Spark性能优化指南——高级篇【2】
- tensorflow--之将数字标签转化为one-hot
- 计算机学业水平测试表格题,2010 年信息技术学业水平考试试题
- 学习笔记(43):R语言入门基础-plot绘制箱体图
- Unity 之 发布字节抖音小游戏
- 华为硬件工程师社招机考题库_华为电子软硬件工程师招聘笔试题
- Python实现带不等式约束的NSGAII算法解决cec2021中的RCM01问题
- 当当网 R 语言学习资料统计分析
- 企业引入大数据/AI 的难点,落地方式以及行业阶段
- 关于自由移站法及坐标转换模型的综述
- html5读取ic卡,企业员工IC卡考勤系统(IC卡读写)
- android 蜂巢平台,Android 3.2来临 蜂巢系统平板详解析
热门文章
- sqlserver与mysql的一些不同的T-SQL语句
- 【信息系统项目管理师】第8章-项目质量管理 知识点详细整理
- 小白使用Eclipse 的基本设置
- 我的.emacs(Ubuntu版)
- Android内核开发:如何统计系统的启动时间
- Android SurfaceView双缓存
- SpringBoot之lombok引入后@Data无法生成getset方法
- mysql数据库逻辑备份与恢复_Mysqldump逻辑备份与恢复
- dedecms怎么改php版本_php.ini配置中有3处设置不当会使网站存在安全问题
- abb变频器acs880说明书_ABB变频器ACS880-104/ACS880-204/ACS880-304产品参数及功能介绍