Java解惑之找零时刻
2015-06-29 22:39
211 查看
谜题2:找零时刻
有如下问题:我去商店买了一包1.1块的东西,身上有2块钱,请问老板该找我多少钱?
这个题小学生都会做,但是我们是未来的程序猿,所以得用代码来实现.(原谅我这一生放荡不羁爱逗比…)
public class Change { public static void main(String[] args){ System.out.println(2.0 - 1.1); } }
It’s so easy….
But….
为什么会这样?
这就是一个坑啊!!
解释:
问题出在
1.1这个数字不能被精确的表示为一个
double,因此它被表示称为最接近它的double值.该程序从2中减去的就是这个值.但是这个计算的结果并不是最接近
0.9的
double值.表示结果的
double值的最短表示就是你所看到的打印出来的那个数字.
更准确的说是不是所有的小数都可以用二进制浮点数来精确表示的.
我们可以用
System.out.printf("%.2f%n",2.00-1.10);来打印我们想要的正确答案,就像回到了C语言一样.但是只是截取了我们希望得到的小数点后2位数,底层依旧还是二进制浮点数的double运算.
解决方法:
使用执行精确小数运算的
BigDecimal;
但是最好使用
BigDecimal(String)构造器,而不是使用
BigDecimal(double)构造器,后一个构造器将用他的参数的精确值来创建一个对象,
new BigDecmal(0.1)将返回
0.1000000000000000055511151231257827021181583404541015625
这么长,我也是醉了
接下里来就是见证奇迹的时刻了…
System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.1")));
成功输出
0.9
这样其实不是最好的,因为java没有为
BigDecimal提供任何语言上的支持,使用
BigDecimal很有可能会比其他使用原始数据类型的计算要慢一些.
反正这么一折腾,我是明白了在需要精确答案的地方,要避免使用
float和
double;对于货币计算,使用
int,long或
BigDecimal会更好.
相关文章推荐
- Java基础:数组
- 写给自己,Java基础整理篇
- .net是什么 都说.net是平台 平台是什么意思? java不是一种语言吗 怎么又拿来和.net比较?
- 深入理解Spring AOP之基本概念
- 生产者消费者模型的四种java编程例子(转载)
- Java中HashMap和TreeMap的区别深入理解(转载)
- java之 ------ 多线程(交互线程)
- Java Class的文件结构
- java初学者知识小总结-02(6.29)
- Spring配置多数据源
- java泛型数组
- 经典版eclipse增加web and JavaEE插件
- spring自动装配Bean属性
- 北大ACM试题1011-DFS
- 基于spring创建通用的Mybatis类
- 码讲——java基础,变量和表达式
- 《Java程序设计》第17周课程设计:《猜猜看》游戏 第一天
- JAVA设计模式初探之装饰者模式
- 用java Swing写一个最简单的图形框
- SpringMVC自定义多视图解析器