浮点数精确表示,java陷阱
/**
- 浮点数表示问题
@author husky
*/
public class Change {
public static void main(String[] args) {
double num1 = 2.00;
double num2 = 1.10;
double num3 = 1.90;
// 结果:0.8999999999999999
System.out.println(num1 - num2);
// 0.10000000000000009
System.out.println(num1 - num3);
// 1.0
System.out.println((num1 - num2) + (num1 - num3));System.out.printf("jdk5 printf : %.2f%n",num1 - num2); //use BigDecimal(String): 0.90 //use BigDecimal(Double): 0.899999999999999911182158029987476766109466552734375 System.out.println("use BigDecimal(String): " + new BigDecimal("2.00").subtract(new BigDecimal("1.10"))); System.out.println("use BigDecimal(Double): " + new BigDecimal(2.00).subtract(new BigDecimal(1.10)));}
/**- 解析:
- java浮点数表示对于一些小数并不能精确的表示,只能表示成它的临界值;
- 但是这只是个别的,详细请参考别处
*/
/**
- 解决:
- 获取在使用jdk 5.0之后,通过printf得到的是正确的结果,但是底层的问题依然存在
- 因此对于涉及需要非常精确的结果,使用浮点数并不合适,尤其是货币运算
- 方案1:
- 将运算进行扩大,使用int,long 进行运算,将2美元表示成200美分进行运算
- 方案2:
- 使用BigDecimal,但要注意使用BigDecimal(String)构造器,不要使用BigDecimal(Double)
- 后者与上面的情况类似的
*/
}
浮点数精确表示,java陷阱的更多相关文章
- 第二章 Java浮点数精确计算
1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用Big ...
- Java陷阱之assert关键字
Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在J ...
- JS/PHP 浮点数精确运算
php浮点数精确运算 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_oper ...
- php浮点数精确运算
php浮点数精确运算 Php: BCMath bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(strin ...
- Java陷阱一箩筐----面试题集及解答
Java陷阱一箩筐----面试题集及解答 面试是没什么道理可讲的,它的题目有的不合情理.脱离实际.有在纸上写的,有当面考你的,也有在电话里问的,给你IDE的估计很少. 当然这些都是Java的基本题,那 ...
- Java浮点数精确计算
BigDecimal是Java提供的一个不变的.任意精度的有符号十进制数对象.
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- 精确计算java中float和double的精度
[本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准 ...
- js浮点数精确计算(加、减、乘、除)
<SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加 ...
随机推荐
- redis ins 调试
Redis简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工 ...
- JavaScript之this指针深入详解
javascript中的this含义非常丰富,它可以是全局对象,当前对象或者是任意对象,这都取决于函数的调用方式.函数有以下几种调用方式:作为对象方法调用.作为函数调用.作为构造函数调用.apply或 ...
- Spark 中的join方式(pySpark)
spark基础知识请参考spark官网:http://spark.apache.org/docs/1.2.1/quick-start.html 无论是mapreduce还是spark ,分布式框架的性 ...
- assembly的说明
Assembly SampleAssembly; // Instantiate a target object. Int32 Integer1 = new Int32(); Type Type1; / ...
- 352. Data Stream as Disjoint Intervals
Plz take my miserable life T T. 和57 insert interval一样的,只不过insert好多. 可以直接用57的做法一个一个加,然后如果数据大的话,要用tree ...
- Python自带的日志模块logging的使用
import logging # 创建一个logger logger = logging.getLogger('cmccLogger') logger.setLevel(logging.DEB ...
- jquery 的小角落
最近换了工作,在这家公司里,使用了大量的jQuery,闲来无事看看锋利的jQuery,发现好多边边角角的选择器,却能省去一大堆逻辑上的的代码,废话不多说直接上代码. #### jquery 对象与do ...
- 【android】ImageView的src和background的区别以及两者的妙用
一.ImageView中XML属性src和background的区别: background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸 .src是图片内 ...
- zedboard--交叉编译Opencv库的生成 分类: shell ubuntu fool_tree的笔记本 ZedBoard OpenCV 2014-11-08 18:57 171人阅读 评论(0) 收藏
Opencv的移植,xzyfeixiang和rainysky的博客. 第一步肯定是下载opencv的源码包 第二步已经做好的交叉编译环境. 第三步下载安装cmake apt-get install ...
- Apache + Tomcat集群配置详解 (1)
一.软件准备 Apache 2.2 : http://httpd.apache.org/download.cgi,下载msi安装程序,选择no ssl版本 Tomcat 6.0 : http://to ...