今天在做接口传保费的时候出现了一个奇怪的问题,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中进行高精度精准计算相关推荐

  1. java double 计算_Java中的Double类型计算

    一.问题的提出: 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out. ...

  2. java 中时间计算_java中关于时间的计算

    1.描述:在原有时间上增加一个时间差: 代码示例: Date psd = sysDate(); String workTimeP1 = mapP.get("WORK_TIME_") ...

  3. math java 计算_Java中的数学计算函数汇总

    Math类:  java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...

  4. java 金额计算_java中金额计算

    在牵涉到金额的计算时,为了保持高精度的准确性,使用bigDecimal类型. 在使用BigDecimal类来进行计算的时候,主要分为以下步骤: 1.用float或者double变量构建BigDecim ...

  5. java中double类型_Java中的Double类型计算

    1 package com.wetalk.wbs.bas.util; 2 3 import java.io.Serializable; 4 import java.math.BigDecimal; 5 ...

  6. java 数据类型分为_JAVA中分为基本数据类型及引用数据类型

    byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值 ...

  7. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  8. java 内部变量_java 中的内置数据类型

    1,  基本数据类型 Java是强类型语言, 对于每一种数据都定义了类型,基本数据类型分为数值型,字符型,布尔型.数值型又分为了整型和浮点型. 整型又分为byte, int, short long. ...

  9. java 序列化实例_Java中的序列化与反序列化实例

    创建的字节流与平台无关.因此,在一个平台上序列化的对象可以在另一个平台上反序列化. 为了使Java对象可序列化,我们实现java.io.Serializable可序列化接口. ObjectOutput ...

最新文章

  1. vue 怎么样不重复往数组里插入数据_Vue.js在数组中插入重复数据的实现代码分享...
  2. AI:神经网络调参(数据、层数、batch大小,学习率+激活函数+正则化+分类/回归)并进行结果可视化
  3. jqury ajax跳转界面,jquery ajax 界面跳转失败解决方案
  4. linux下安装davinci
  5. Spring boot与Quartz实现任务定时提醒
  6. Maven项目POM文件错误,提示“Plugin execution not covered by lifecycle configuration”的解决方案...
  7. OpenStack Cinder发展动态系列--Austin峰会
  8. GPU GEMS 3 EBOOK下载
  9. 配置中心.php,FastD 最佳实践二: 构建配置中心
  10. 稳压二极管型号大全(转载)
  11. [noip2011]铺地毯(carpet)解题报告
  12. 466. 统计重复个数
  13. Windows 10无法打开设置
  14. Android 语音遥控器的整体分析-主机端语音解码的添加
  15. STM32应用(十)经典控制算法PID(单级和串级)原理与代码实现
  16. MSF开启socks代理内网渗透
  17. 20175227张雪莹 2018-2019-2 《Java程序设计》第四周学习总结
  18. HTML 高度不祥的情况下自动水平垂直居中
  19. 双十一剁手族,电商背后的那些技术你们造吗?
  20. SpringBoot学习视频

热门文章

  1. Python使用matplotlib可视化气泡图、并使用encircle函数自定义多边形圈定可视化图像中的指定区域(Bubble plot with Encircling)
  2. R语言使用caretEnsemble包的caretList函数一次性构建多个机器学习模型、使用lattice包的bwplot函数使用箱图对比多个模型在多个指标上的性能差异
  3. R语言pmax函数和pmin函数按位计算向量最大值、最小值实战
  4. R语言ggplot2可视化使用ggplot2::ggsave函数和gridextra::marrangegrob函数将多个可视化结果保存在pdf文件中
  5. R语言可视化包ggplot2在一张图中画出两条线实战
  6. R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)
  7. Science:便携式DNA测序仪在检测病毒疫情中大显身手
  8. hive mysql 远程_ubuntu中为hive配置远程MYSQL database
  9. google浏览器插件安装时出错,Package is invalid: CRX HEADER INVALID
  10. 语义分割--Pixel Deconvolutional Networks