java float 加减精度问题

在取这个字段的时候转换成BigDecimal就可以了

同时,BigDecimal是可以设置精度的。

float m = 12.22F;

float c = 1.22F;

BigDecimal b1 = new BigDecimal(Float.toString(m));

BigDecimal b2 = new BigDecimal(Float.toString(c));

System.out.println(m);

System.out.println(c);

Float add = b1.add(b2).floatValue();

System.out.println("add=========" + add);

Float less = b1.subtract(b2).floatValue();

System.out.println("less=========" + less);

Float multiply = b1.multiply(b2).floatValue();

System.out.println("multiply=========" + multiply);

//给divide设置精确的小数点,解决不整除报异常

Float divide = b1.divide(b2,4, BigDecimal.ROUND_HALF_EVEN).floatValue();

System.out.println("divide=========" + divide);

===========================================

BigDecimal不整除的一个异常java.lang.ArithmeticException: Non-terminating decimal expansion

金额的数据类型是BigDecimal

通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException:

Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)

应用场景:一批中供客户的单价是1000元/年,如果按月计算的话1000/12=83.3333333333....

解决之道:就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)

在 java中, 四舍五入通过 BigDecimal 来实现。一定要注意:BigDecimal is Immutable。

也就是跟String一样,对前一个的修改,比如setScale(), add()等都会返回一个新的BigDecimal.

四舍五入舍入模式是 BigDecimal.ROUND_HALF_UP

BigDecimal定义了一下舍入模式,只有在作除法运算或四舍五入时才用到舍入模式,

下面简单介绍,详细请查阅J2se API文档

static int

ROUND_CEILING

Rounding mode to round towards positive infinity.

向正无穷方向舍入

static int

ROUND_DOWN

Rounding mode to round towards zero.

向零方向舍入

static int

ROUND_FLOOR

Rounding mode to round towards negative infinity.

向负无穷方向舍入

static int

ROUND_HALF_DOWN

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,

in which case round down.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入,例如1.55保留一位

小数结果为1.5

static int

ROUND_HALF_EVEN

Rounding mode to round towards the "nearest neighbor" unless both neighbors are equidistant,

in which case, round towards the even neighbor.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,

使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN

static int

ROUND_HALF_UP

Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant,

in which case round up.

向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位

小数结果为1.6

static int

ROUND_UNNECESSARY

Rounding mode to assert that the requested operation has an exact result, hence no

rounding is necessary.

计算结果是精确的,不需要舍入模式

static int

ROUND_UP

Rounding mode to round away from zero.

向远离0的方向舍入

===========================================

如何应用Java的BigDecimal类

双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。表5.7中列出了BigDecimal类的主要构造器和方法。

表5.7 BigDecimal类的主要构造器和方法

构造器 描 述

BigDecimal(int)创建一个具有参数所指定整数值的对象。

BigDecimal(double)创建一个具有参数所指定双精度值的对象。

BigDecimal(long)创建一个具有参数所指定长整数值的对象。

BigDecimal(String)创建一个具有参数所指定以字符串表示的数值的对象。

续表

方 法描 述

add(BigDecimal)BigDecimal对象中的值相加,然后返回这个对象。

subtract(BigDecimal)BigDecimal对象中的值相减,然后返回这个对象。

multiply(BigDecimal)BigDecimal对象中的值相乘,然后返回这个对象。

divide(BigDecimal)BigDecimal对象中的值相除,然后返回这个对象。

toString()将BigDecimal对象的数值转换成字符串。

doubleValue()将BigDecimal对象中的值以双精度数返回。

floatValue()将BigDecimal对象中的值以单精度数返回。

longValue()将BigDecimal对象中的值以长整数返回。

intValue()将BigDecimal对象中的值以整数返回。

注意,由于一般数值类型,例如double,不能准确地代表16位有效数以上的数字,在使用BigDecimal时,应用BigDecimal(String)构造器创建对象才有意义。另外,BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。

构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。关于构造器概念和编写技术,将在本书第6章详细介绍。

java float 加法_Java-杂项:Float 加减精度问题相关推荐

  1. java 整数加减_Java计算长整数加减(字符串表示)

    1 /** 2 * Created by areful on 2019/11/133 */ 4 public classCalcStringNumber {5 private static final ...

  2. java时间差的百分之二十,Java对日期Date类进行加减运算、年份加减月份加减、时间差等等...

    实现代码一: import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public c ...

  3. php 时间加法函数_php 时间加减

    date_default_timezone_set('PRC'); //默认时区 echo "今天:",date("Y-m-d",time())," ...

  4. java float 加法_JAVA 实现精确的加减乘除运算

    JAVA在加减乘除运算时易发生精度丢失,达不到我们想要的计算结果:为了能够精确表示.计算浮点数,JAVA提供了BigDecimal类,可以以BigDecimal为基础定义一个Arith工具类,代码如下 ...

  5. java double 赋值语句_Java中float、double、long类型变量赋值添加f、d、L尾缀问题

    展开 1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明. 其中,long类型最好以 ...

  6. java float是_java中float是什么意思

    Java中float的意思"浮动",代表的是一种浮点数数据类型,它内存分配4个字节,占32位,范围从"10^-38"到"10^38"和&qu ...

  7. java 时间加减_Java中时间加减的比较

    public class TestDate{ public static void main(String[] args){ try{ Date date=new Date(); DateFormat ...

  8. java类型转换 float类型转换_Java类型转换 – float(和long)到int

    2147483648.0实际上是231,而int的最大值是231-1.那么这个浮点值就是一个值太高的值. In the first step, the floating-point number is ...

  9. java字符如何向float转换_java – 将float转换为字符串分数表示

    最简单的方法可能是使用反复试验. public static String toFraction(double d, int factor) { StringBuilder sb = new Stri ...

最新文章

  1. Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)...
  2. Android学习笔记-Wifi网络操作
  3. bootstrap ui
  4. python学起来难不难-自学Python很难吗,为何会看不进去!
  5. hbase 研究 :LoadIncrementalHFiles/HFileOutputFormat2 cannot be resolved
  6. js 操作java对象_JavaScript 对象基础
  7. smp架构与numa架构_NUMA架构和Java
  8. 火狐 移动 html 元素,python中的Firefox+Selenium:如何交互式地获取元素html?
  9. 如何排查mysql数据乱码_如何解决MYSQL数据库中文乱码问题?
  10. mysql中的where 1 1_SQL语句中where 1=1和where 1=0的作用
  11. Hi3559AV100的MPP系统绑定实现
  12. c语言111111等于111 11,c语言第02章数据类型.ppt
  13. QT tablewidget设置表头
  14. zigbee CC2530 系列教程 12 温度传感器DS18B20实验
  15. Python编程:loguru管理日志输出
  16. 计算机u盘设备无法启动不了怎么办,u盘无法启动提示错误代码10该怎么处理
  17. 【Mysql】Communications link failure,The last packet sent successfully to the server was 0 millisecond
  18. php 备份数据库插件,zblog php数据库备份插件TiQuan_DB_Backups
  19. 线代笔记:线性相关性,向量组的秩
  20. pytorch 中 expand ()函数

热门文章

  1. 线程同步 阻塞 异步 非阻塞(转)
  2. 解决VMware虚拟机时间同步问题
  3. [C#泛型系列文章]
  4. 云从科技在渝布局人工智能大数据平台
  5. leetcode - 150. Evaluate Reverse Polish Notation
  6. 毕设开发日志2017-11-03
  7. 《CCNA学习指南:Cisco网络设备互连(ICND1)(第4版)》——1.13节生产网络模拟问题1-1...
  8. 64位jvm的指针膨胀 和 数据补白
  9. 使用和制作patch文件
  10. 将多个文件的属性添加到数据库