- 浏览: 2966593 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (893)
- android (110)
- iphone (198)
- java (79)
- JavaScript手册-目录 (9)
- JavaScript手册-Array (19)
- JavaScript手册-Boolean (5)
- JavaScript手册-Date (50)
- JavaScript手册-Math (30)
- JavaScript手册-Number (14)
- JavaScript手册-RegExp (7)
- JavaScript手册-String (38)
- JavaScript手册-全局函数 (8)
- JavaScript实用脚本 (7)
- Others (21)
- java-jpcap (7)
- java-thread (1)
- ibm文章 (3)
- classloader (2)
- java-filter (2)
- 运行环境 (33)
- java-正则 (2)
- oracle (1)
- linux-shell (26)
- wap (1)
- sqlite (3)
- wow (1)
- jvm (1)
- git (5)
- unity3d (29)
- iap (2)
- mysql (23)
- nginx (14)
- tomcat (9)
- apache (2)
- php (1)
- ubuntu (40)
- rsa (1)
- golang (21)
- appstore (5)
- sftp (2)
- log4j (2)
- netty (18)
- 测试工具 (6)
- memcache (5)
- 设计模式 (1)
- centos (8)
- google_iab (5)
- iOS专题 (4)
- mac (10)
- 安装配置帮助手册 (2)
- im4java_graphicsmagick (5)
- inotify-tools (1)
- erlang (6)
- 微信支付 (1)
- redis (8)
- RabbitMQ (5)
最新评论
-
heng123:
Netty视频教程https://www.douban.com ...
netty4.0.23 初学的demo -
maotou1988:
使用Netty进行Android与Server端通信实现文字发 ...
netty4.0.23 初学的demo -
码革裹尸:
非常感谢,正好用上
android 呼入电话的监听(来电监听) -
rigou:
提示的/222.177.4.242 无法链接到ip地址,是什 ...
通过 itms:services://? 在线安装ipa ,跨过app-store -
duwanbo:
GridView与数据绑定
★★★ 本篇为原创,需要引用转载的朋友请注明:《 http://stephen830.iteye.com/blog/260776 》 谢谢支持!★★★
本篇介绍了在JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:
-------------------------------------------------------------
分享知识,分享快乐,希望文章能给需要的朋友带来小小的帮助。
//ROUND_HALF_EVEN
//如果第3位是偶数,则做ROUND_HALF_DOWN
//如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35 System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
虽然你这里做的结果好像证实了你对HALF_EVEN的解释,但事实上并不是这样。
ROUND_HALF_EVEN是精确地验证要舍去部分与5的大小,并不只是简单看被舍去的这一位。
假如有数字12.345,该规则得到的是12.34 (先不说为什么你这里是12.35,后面解释)
假如有数字12.335,该规则得到的也是12.34,
假如有数字12.34501,该规则得到的是12.35. JAVA API里有详细解释。
再说说你的12.345为什么得到的是12.35呢?也许这只是个巧合。我们知道计算机在处理小数的时候,有很多小数是没办法真正精确的(因为2进制问题), 你的代码里的12.345在jvm里当做double来存储,而这个小数是没法被计算机精确表达的,它的实际值可能是12.345000000000000001221这样,当你用double类型去构造BigDecimal的时候,得到的BigDecimal实例就包含了后面这一长串尾巴,而BigDecimal类认为这一长串尾巴是有用的,于是setScale(2,ROUND_HALF_EVEN)时,它认为该数字并不是在正中间,而是偏向12.35,于是结果就成了12.35 。
不信你可以验证:
使用你的round方法,看round(8.125,2,BigDecimal.ROUND_HALF_EVEN)是否依然是8.12?而不是你想的8.13?
另外你可以System.out.pringln(new BigDecimal(12.345)),看输出结果是否很长。
再对比System.out.pringln(new BigDecimal(8.125)),System.out.pringln(new BigDecimal("12.345")).
本篇介绍了在JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:
/* * Created on 2005-6-5 * Author stephen * Email zhoujianqiang AT gmail DOT com * CopyRight(C)2005-2008 , All rights reserved. */ package com.soft4j.utility; import java.math.BigDecimal; /** * 与小数位精度(四舍五入等)相关的一些常用工具方法. * * float/double的精度取值方式分为以下几种: <br> * java.math.BigDecimal.ROUND_UP <br> * java.math.BigDecimal.ROUND_DOWN <br> * java.math.BigDecimal.ROUND_CEILING <br> * java.math.BigDecimal.ROUND_FLOOR <br> * java.math.BigDecimal.ROUND_HALF_UP<br> * java.math.BigDecimal.ROUND_HALF_DOWN <br> * java.math.BigDecimal.ROUND_HALF_EVEN <br> * * @author stephen * @version 1.0.0 */ public final class RoundTool { /** * 对double数据进行取精度. * <p> * For example: <br> * double value = 100.345678; <br> * double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br> * ret为100.3457 <br> * * @param value * double数据. * @param scale * 精度位数(保留的小数位数). * @param roundingMode * 精度取值方式. * @return 精度计算后的数据. */ public static double round(double value, int scale, int roundingMode) { BigDecimal bd = new BigDecimal(value); bd = bd.setScale(scale, roundingMode); double d = bd.doubleValue(); bd = null; return d; } /** * 测试用的main方法. * * @param argc * 运行参数. */ public static void main(String[] argc) { //下面都以保留2位小数为例 //ROUND_UP //只要第2位后面存在大于0的小数,则第2位就+1 System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35 System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35 //ROUND_DOWN //与ROUND_UP相反 //直接舍弃第2位后面的所有小数 System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34 System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34 //ROUND_CEILING //如果数字>0 则和ROUND_UP作用一样 //如果数字<0 则和ROUND_DOWN作用一样 System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35 System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34 //ROUND_FLOOR //如果数字>0 则和ROUND_DOWN作用一样 //如果数字<0 则和ROUND_UP作用一样 System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34 System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35 //ROUND_HALF_UP [这种方法最常用] //如果第3位数字>=5,则第2位数字+1 //备注:只看第3位数字的值,不会考虑第3位之后的小数的 System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35 System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34 System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35 System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34 //ROUND_HALF_DOWN //如果第3位数字>=5,则做ROUND_UP //如果第3位数字<5,则做ROUND_DOWN System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35 System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34 System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35 System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34 //ROUND_HALF_EVEN //如果第3位是偶数,则做ROUND_HALF_DOWN //如果第3位是奇数,则做ROUND_HALF_UP System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35 System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35 } }
-------------------------------------------------------------
分享知识,分享快乐,希望文章能给需要的朋友带来小小的帮助。
评论
1 楼
lirui_andy
2013-03-14
引用
//ROUND_HALF_EVEN
//如果第3位是偶数,则做ROUND_HALF_DOWN
//如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35 System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
虽然你这里做的结果好像证实了你对HALF_EVEN的解释,但事实上并不是这样。
ROUND_HALF_EVEN是精确地验证要舍去部分与5的大小,并不只是简单看被舍去的这一位。
假如有数字12.345,该规则得到的是12.34 (先不说为什么你这里是12.35,后面解释)
假如有数字12.335,该规则得到的也是12.34,
假如有数字12.34501,该规则得到的是12.35. JAVA API里有详细解释。
再说说你的12.345为什么得到的是12.35呢?也许这只是个巧合。我们知道计算机在处理小数的时候,有很多小数是没办法真正精确的(因为2进制问题), 你的代码里的12.345在jvm里当做double来存储,而这个小数是没法被计算机精确表达的,它的实际值可能是12.345000000000000001221这样,当你用double类型去构造BigDecimal的时候,得到的BigDecimal实例就包含了后面这一长串尾巴,而BigDecimal类认为这一长串尾巴是有用的,于是setScale(2,ROUND_HALF_EVEN)时,它认为该数字并不是在正中间,而是偏向12.35,于是结果就成了12.35 。
不信你可以验证:
使用你的round方法,看round(8.125,2,BigDecimal.ROUND_HALF_EVEN)是否依然是8.12?而不是你想的8.13?
另外你可以System.out.pringln(new BigDecimal(12.345)),看输出结果是否很长。
再对比System.out.pringln(new BigDecimal(8.125)),System.out.pringln(new BigDecimal("12.345")).
发表评论
-
Java的内存机制
2016-08-22 13:27 4451.Java的内存机制 Java 把内存划分成两 ... -
监听域对象中属性的变更的监听器
2016-07-18 19:06 1700监听域对象中属性的变更的监听器 域对象中属性 ... -
HttpSessionActivationListener
2016-07-18 18:46 600HttpSessionActivationListe ... -
Web容器监听器(实现在线统计人数,踢人)
2016-07-18 10:48 910Web容器监听器(实现在线统计人数,踢人) Servl ... -
HttpSessionBindingListener接口
2016-07-18 10:29 603HttpSessionBindingListene ... -
ServletRequestAttributeListener接口
2016-07-17 22:24 7872. HttpSessionAttribut ... -
Servlet3中异步Servlet特性介绍
2016-07-17 15:50 800Servlet3中异步Servlet特性介绍 ... -
HttpSessionAttributeListener
2016-07-15 17:49 648HttpSessionAttributeListener ... -
使用ServletContextAttributeListener
2016-07-15 16:47 793使用ServletContextAttr ... -
ServletRequestListener
2016-07-15 16:25 563ServletRequestListener接口 ... -
HttpSessionListener
2016-07-15 14:56 594HttpSessionListener接口 M ... -
ServletContextListener 接口
2016-07-15 12:16 580在 Servlet API 中有一个 Se ... -
ReflectASM,高性能的反射
2016-04-29 17:19 923http://www.oschina.net/p/r ... -
Java多线程与静态方法
2016-04-26 11:52 808Java多线程与静态方法 在多线程中使用静态方法会发生什么 ... -
log4j日志输出格式
2016-04-12 20:58 1065log4j日志输出格式 在LOG4J的配置文件中,l ... -
Servlet3.0
2016-04-12 16:58 651一、Servlet3.0介绍 Servlet3 ... -
log4j2 使用详解
2016-04-12 14:14 1410log4j2 使用详解 转载自 Blog of ... -
Eclipse jar打包和命令行运行
2016-04-08 10:44 2903?Eclipse jar打包和命令行运行 第1步: ... -
GRAPHICSMAGICK+IM4JAVA错误Cannot run program "gm": error=2
2015-05-19 15:27 4066在通过 GRAPHICSMAGICK+IM4JAVA ... -
GraphicsMagick安装、实时生成缩略图
2015-05-19 13:39 2368GraphicsMagick安装、实时生成缩略图 ...
相关推荐
Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...
浮点数转化器,单精度浮点计算软件,FLOAT转HEX
c语言浮点数高精度加法计算
float double 的浮点数类型转换
在计算机中有关浮点数转二进制的计算方法,里面讲得很清楚,原来是PPT文档,我已转成PDF的格式,看起来非常舒服。在编程中,特别是一些算法中经常用会一些浮点数的计算
目前支持二进制浮点数的硬件和软件文档中,几乎都声称其浮点数实现符合IEEE 754标准。那么,什么是IEEE 754标准? 最权威的解释是IEEE754标准本身ANSI/IEEE Std 754-1985《IEEE Standard for Binary Floating-Point...
浮点数在内存中的存储机制和整型数...1、将字符串转换为float、double过程存在精度损失,只是float、double各自损失的精度不相同而已std::string str=”8.2″;float cc=atof(str.c_str()); //cc的值为8.1999998std:
[Java]IEEE754浮点数的转换方法,方法都写好了,直接复制过去就可以用了,就这么简单!
用java从文件中读取浮点数 已经亲自实践过,没有问题
自己动手写C语言float浮点数转换字符串的函数
单精度浮点数,双精度浮点数,浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。
符合IEEE754规则的4字节数组转换为单精度浮点数的Labview实用小vi
使用C++位运算实现4字节十六进制数转换为float数,在项目应用中需要此函数,没有找到合适的现成实现代码,所以自己编写实现了一个函数,希望对用着的朋友有帮助
根据IEEE754规定写了个float型数据与二进制数转换的方法
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是不会抛异常,而是得出无穷大的结果.本工具类解决了上述问题.该类提供了加减乘除四则运算的精确计算...
C# Byte数组 数值转花 Int32 Short Float 浮点数 自己写的Test 有问题可以联系我
一个关于浮点数的计算软件,也就是一个浮点数对应的4字节数值是多少,该软件会帮你显示出来,特别在一个通讯传输,或则在调试算法的时候这个软件还是很有用的
浮点数精度
结合图释详细介绍浮点数的计算机存储结构。解释了IEEE有关浮点数的标准。