博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Java】Float计算不准确
阅读量:6437 次
发布时间:2019-06-23

本文共 2390 字,大约阅读时间需要 7 分钟。

大家可能都遇到过,float在计算某些值时,会有不准确的情况。

比如如下情况:

 

> 计算不准确

package com.nicchagil.study.java.demo.No10float计算.No01不准确的举例;public class Call {    public static void main(String[] args) {        System.out.println(0.08f + 0.01f);    }}

 

打印:

0.089999996

 

> 用BigDecimal代替计算

如果需要准确计算float,一种方法就是用BigDecimal来进行计算,看以下工具类:

import java.math.BigDecimal;public class FloatCalculator {    /**     * 

add

* @param a * @param b * @return */ public static float add(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.add(b2).floatValue(); return f; } /** *

subtract

* @param a * @param b * @return */ public static float subtract(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.subtract(b2).floatValue(); return f; } /** *

multiply

* @param a * @param b * @return */ public static float multiply(float a, float b) { BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.multiply(b2).floatValue(); return f; } /** *

divide

*

当不整除,出现无限循环小数时,向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

* @param a * @param b * @return */ public static float divide(float a, float b) { return divide(a, b, 2, BigDecimal.ROUND_HALF_UP); } /** *

divide

* @param a * @param b * @param scale * @param roundingMode * @return */ public static float divide(float a, float b, int scale, int roundingMode) { /* * 通过BigDecimal的divide方法进行除法时就会抛异常的,异常如下: * java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source) * 解决之道:就是给divide设置精确的小数点divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN) * BigDecimal.ROUND_HALF_UP : 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 */ BigDecimal b1 = new BigDecimal(a + ""); BigDecimal b2 = new BigDecimal(b + ""); float f = b1.divide(b2, scale, roundingMode).floatValue(); return f; } }

 

转载地址:http://xvzwo.baihongyu.com/

你可能感兴趣的文章
[基础]iOS 可视化编程(全系列)
查看>>
我的友情链接
查看>>
LVS之NAT模型配置实验
查看>>
nginx 报错 99: Cannot assign requested address
查看>>
几种流行的AJAX框架:jQuery,Mootools,Dojo,Ext JS的对比
查看>>
Socket-Client通信
查看>>
Maven搭建简单的SS项目
查看>>
#我要上首页# 新版博客首页来了,做明星博主还会远吗?
查看>>
PHP缓存技术
查看>>
关于SOCKET资源堆栈
查看>>
笔记 百度搜索
查看>>
控制台 - 网络管理之华为交换机 S系列端口限速
查看>>
我的友情链接
查看>>
linux为启动菜单加密码
查看>>
MySQL5.5编译方式安装实战
查看>>
细谈Ehcache页面缓存的使用
查看>>
GridView如何设置View的初始样式
查看>>
Placeholder in IE8 and older
查看>>
SQL语句字符串处理大全
查看>>
环境变量的作用,为什么要设置环境变量?
查看>>