大家可能都遇到过,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 {

    /**
* <p>add</p>
* @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; } /**
* <p>subtract</p>
* @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; } /**
* <p>multiply</p>
* @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; } /**
* <p>divide</p>
* <p>当不整除,出现无限循环小数时,向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6</p>
* @param a
* @param b
* @return
*/
public static float divide(float a, float b) { return divide(a, b, 2, BigDecimal.ROUND_HALF_UP); } /**
* <p>divide</p>
* @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; } }

【Java】Float计算不准确的更多相关文章

  1. Java精确计算

    Java精确计算 如果我们编译运行下面这个程序会看到什么? public class Test{ public static void main(String args[]){ System.out. ...

  2. Java float保留两位小数或多位小数

    Java float保留两位小数或多位小数 方法1:用Math.round计算,这里返回的数字格式的.    float price=89.89;int itemNum=3;float totalPr ...

  3. java为啥计算时间从1970年1月1日开始

    http://www.myexception.cn/program/1494616.html ————————————————————————————————————————————————————— ...

  4. java精确计算工具类

    java精确计算工具类 import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; ...

  5. Java精确计算小数

    Java在计算浮点数的时候,由于二进制无法精确表示0.1的值(就好比十进制无法精确表示1/3一样),所以一般会对小数格式化处理. 但是如果涉及到金钱的项目,一点点误差都不能有,必须使用精确运算的时候, ...

  6. java对数计算

    Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差.但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了. Sun的J2SE提供了一个单一的Java对数方法 ...

  7. java精确计算、精确计算工具类

    java精确计算 package org.aisino.erp.webservice.dzfp.util; import java.math.BigDecimal; public class Math ...

  8. Spark Java API 计算 Levenshtein 距离

    Spark Java API 计算 Levenshtein 距离 在上一篇文章中,完成了Spark开发环境的搭建,最终的目标是对用户昵称信息做聚类分析,找出违规的昵称.聚类分析需要一个距离,用来衡量两 ...

  9. 解决java float double 浮点型参与计算失精度

    本人前段时间做一个社区电商应用,发现了一个 天坑   ...................让我哭会 . 下面听听我的踩坑之路吧 ,电商肯定跟¥打交道了,计算少不了的.由于本人太菜 单纯的以为  fl ...

随机推荐

  1. 封装page分页类

    类: <?php //分页工具类 class Page{ /*         * 获取分页字符串         * @param1 string $uri,分页要请求的脚本url       ...

  2. JavaOOP QuickHit项目分析

    项目需求:游戏等级6级,随机字符串每级长度不同.每升一级减少比较次数,但是字符串长度相应增加!每级总分数不同,如果游戏中途输入错误则游戏退出!玩家每次在规定时间内输入字符串的同时,打印出游戏难度等级. ...

  3. 1021: A除以B

    1021: A除以B 时间限制: 1 Sec  内存限制: 128 MB提交: 263  解决: 189[提交][状态][讨论版] 题目描述 本题要求计算A/B,其中A是不超过1000位的正整数,B是 ...

  4. 夺命雷公狗ThinkPHP项目之----企业网站28之网站前台左侧导航的实现

    我们基于刚才在model层的找顶级分类的代码在进行修改即可: <?php namespace Home\Controller; use Think\Controller; class Commo ...

  5. 使用Json.Net处理json序列化和反序列化接口或继承类

    以前一直没有怎么关注过Newtonsoft的Json.Net这个第三方的.NET Json框架,主要是我以前在开发项目的时候大多数使用的都是.NET自带的Json序列化类JavaScriptSeria ...

  6. Openstack的ping不通实例的解决办法

    状态:实例在管理平台上正常创建,也能vnc到实例里面使用ifconfig,查看IP得到我们想要的IP,但是在除了计算节点以外的机器ping实例就是不通. 操作:主要为了测试网络51删除,重新创建网络5 ...

  7. [转]通过PowerShell工具跨多台服务器执行SQL脚本

    转至:http://www.cnblogs.com/SameZhao/p/4743692.html 有时候,当我们并没有合适的第三方工具(大部分需要付费)去管理多台数据库服务器,那么如何做最省力.省心 ...

  8. iOS 学习笔记 一 (2015.02.05)

    一:Xcode6输入框设置为 keyboard type设置为Number Pad弹不出键盘的解决办法   问题:Can't find keyplane that supports type 4 fo ...

  9. mysql datetime设置now()无效,直接用程序设置默认值比较好

    mysql datetime设置now()无效的,没有此用法,datetime类型不能设置函数式默认值,只能通过触发器等来搞.想设置默认值,只能使用timestamp类型,然后默认值设置为:CURRE ...

  10. Java 基本数据类型 sizeof 功能【转】

    转自:http://blog.csdn.net/sunboy_2050/article/details/7310008 版权声明:本文为博主原创文章,未经博主允许不得转载. Java基本数据类型int ...