java 精确 计算_java中进行高精度精准计算
今天在做接口传保费的时候出现了一个奇怪的问题,double类型保费变成了一大长串的非精准保费,甚至奇怪,难道是java的bug?最后通过度娘找到了答案
话不多说,先看如下代码public final class Person {
public static void main(String[] args) {
double a1 = 0.06;
double a2 = 0.01;
System.out.println(a1);
System.out.println(a2);
System.out.println(a2 + a1);
}
}
结果并不是0.07,而是0.06999999999999999
你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。
其实Java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
如何使用这个BigDecimal呢,拢共分三步,
一.用float或者double变量构建BigDecimal对象
构建有两种方法:1.BigDecimal b1 =newBigDecimal(xxx); xxx可以是double类型,也可以是string类型
2.BigDecimal b2 = BigDecimal.valueOf(xxx); xxx 只能是数值类型
注意:推荐使用第一种方法,并采用string类型进行构建。否则还是会出现2.0809999999999的情况。
二.通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算public BigDecimal add(BigDecimal value); //加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法
三.把BigDecimal对象转换成float,double,int等类型double a1 = b2.doubleValue();
float a2 = b2.floatValue();
直接通过BigDecimal 进行计算比较麻烦,可以封装一层,简化使用
java 精确 计算_java中进行高精度精准计算相关推荐
- java double 计算_Java中的Double类型计算
一.问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out. ...
- java 中时间计算_java中关于时间的计算
1.描述:在原有时间上增加一个时间差: 代码示例: Date psd = sysDate(); String workTimeP1 = mapP.get("WORK_TIME_") ...
- math java 计算_Java中的数学计算函数汇总
Math类: java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...
- java 金额计算_java中金额计算
在牵涉到金额的计算时,为了保持高精度的准确性,使用bigDecimal类型. 在使用BigDecimal类来进行计算的时候,主要分为以下步骤: 1.用float或者double变量构建BigDecim ...
- java中double类型_Java中的Double类型计算
1 package com.wetalk.wbs.bas.util; 2 3 import java.io.Serializable; 4 import java.math.BigDecimal; 5 ...
- java 数据类型分为_JAVA中分为基本数据类型及引用数据类型
byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...
- java mod %区别_Java中 % 与Math.floorMod() 区别详解
%为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...
- java 内部变量_java 中的内置数据类型
1, 基本数据类型 Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型.数值型又分为了整型和浮点型. 整型又分为byte, int, short long. ...
- java 序列化实例_Java中的序列化与反序列化实例
创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...
最新文章
- vue 怎么样不重复往数组里插入数据_Vue.js在数组中插入重复数据的实现代码分享...
- AI:神经网络调参(数据、层数、batch大小,学习率+激活函数+正则化+分类/回归)并进行结果可视化
- jqury ajax跳转界面,jquery ajax 界面跳转失败解决方案
- linux下安装davinci
- Spring boot与Quartz实现任务定时提醒
- Maven项目POM文件错误,提示“Plugin execution not covered by lifecycle configuration”的解决方案...
- OpenStack Cinder发展动态系列--Austin峰会
- GPU GEMS 3 EBOOK下载
- 配置中心.php,FastD 最佳实践二: 构建配置中心
- 稳压二极管型号大全(转载)
- [noip2011]铺地毯(carpet)解题报告
- 466. 统计重复个数
- Windows 10无法打开设置
- Android 语音遥控器的整体分析-主机端语音解码的添加
- STM32应用(十)经典控制算法PID(单级和串级)原理与代码实现
- MSF开启socks代理内网渗透
- 20175227张雪莹 2018-2019-2 《Java程序设计》第四周学习总结
- HTML 高度不祥的情况下自动水平垂直居中
- 双十一剁手族,电商背后的那些技术你们造吗?
- SpringBoot学习视频
热门文章
- Python使用matplotlib可视化气泡图、并使用encircle函数自定义多边形圈定可视化图像中的指定区域(Bubble plot with Encircling)
- R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异
- R语言pmax函数和pmin函数按位计算向量最大值、最小值实战
- R语言ggplot2可视化使用ggplot2::ggsave函数和gridextra::marrangegrob函数将多个可视化结果保存在pdf文件中
- R语言可视化包ggplot2在一张图中画出两条线实战
- R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)
- Science:便携式DNA测序仪在检测病毒疫情中大显身手
- hive mysql 远程_ubuntu中为hive配置远程MYSQL database
- google浏览器插件安装时出错,Package is invalid: CRX HEADER INVALID
- 语义分割--Pixel Deconvolutional Networks