大家可能都遇到过,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. JSP数据交互习题错误总结

    1:如果注册完页面有中文字符需要在提交后的页面显示注册信息,切记先把接受到的request的编码方式改为中文:request.setCharacterEncoding("utf-8" ...

  2. <构建之法>之一至二章

    身在大学,却想起了在高中的生活和初中的生活,特别是初中的生活,为什么这么说呢!因为<构建之法>,看了其中的两章的内容,为什么想到了初中和高中的生活呢,因为在高中和初三的时候看的最多的就是课 ...

  3. JavaScript中Date(日期对象),Math对象--学习笔记

    Date对象 1.什么是Date对象? 日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 语法:var Udate=new Date();  注:初始值为当前时间(当前电脑系统 ...

  4. 《zw版·delphi与halcon系列原创教程》zw版_THOperatorSetX控件函数列表 v11中文增强版

    <zw版·delphi与halcon系列原创教程>zw版_THOperatorSetX控件函数列表v11中文增强版 Halcon虽然庞大,光HALCONXLib_TLB.pas文件,源码就 ...

  5. [py]安装ipython

    系统:crunch bang11+python2.7.3 准备工具: sudo apt-get install python-pip python-dev build-essential 安装setu ...

  6. 【crunch bang】文件管理器-thunar

    Thunar拥有的实用功能: 缩略图查看 批量重命名 安装: $ sudo apt-get install thunar 加速thunar启动速度 sudo leafpad /usr/share/gv ...

  7. ASP.NET输出流至少要有256个字节的数据后Response.Flush方法才会生效

    很多时候我们写的asp.net程序会因为做很多操作,所以会花上一分钟甚至几分钟时间.为了使软件使用者能够耐心的等待程序的执行,我们经常会希望有一个进度条来表示程序执行的状态.或者最起码要显示一个类似: ...

  8. fedora环境安装webkit支持作爬虫下载解析JS

    环境: 我使用的fedora19.1-xfce版本,属于redhat系的桌面环境. 1.安装 webkit源码安装webkit失败,这里提供的是yum安装方式. a.查看当前yum库中的webkit资 ...

  9. TI CC2541的中断优先级设置.

    实际看到的中断优先级设置是这样的:

  10. ASP开发入门+实战电子书共50本 —下载目录

    小弟为大家整理50个ASP电子书籍,有入门,也有实战电子书,做成了一个下载目录,欢迎大家下载. 资源名称 资源地址 ASP.NET开发实战1200例_第I卷 http://down.51cto.com ...