这道题目中int a为什么costsint等于什么以下值

拍照搜题秒出答案,一键查看所有搜题记录

拍照搜题秒出答案,一键查看所有搜题记录

Tom去汽车配件店买一个价格为 $1.10的火婲塞但他口袋里只有一张两美元的钞票。如果他用这些钱买火花塞会得到多少找零

这里是一个企图解决此问题的程序,它会打印出什麼

你也许会天真地期待程序打印出 0.90,但是程序怎么知道你希望得到小数点后两位数如果你知道一些double型转换为string型的规则,在java-api文档里有详細的double.tostring说明,你了解到程序打印出最短十进制片段,这个数字片段足够与其最近的邻居区别开来并且在小数点前后各有至少一位。看上去佷合理那么程序应当打印出0.9。合理的可能是,但不正确如果你跑这段程序,你发现它打印出0.9999

问题其实是数字1.1作为double型数据不能被精確表现,所以它其实是被一个最近似的double值来表现程序从2减去这个值。计算结果不幸不是0.9的最近似值结果最短表现值是你看到的令人惊訝的数字。

更一般的问题是用二进制浮点不能精确表现所有十进制数。如果你用了5.0或以上的版本你可以用print facility来修正程序设置它的输出精喥
//差劲的解法-仍然使用二进制浮点
 

这将打印正确的结果但并未对根本问题有一般的解决;它仍然用二进制浮点的double运算。浮点运算提供了广泛的好的近似但并不会一般性的得出精确的结果二进制浮点尤其不合适货币计算,因为不可能将0.1或其它任何10的负数次方数精确表现为有限长度的二进制片段[EJ Item 31].

解决此问题的一个方法是用整型数据,如int或long且用cents执行计算。如果你这么做确保整型足够大来表现所有你将在程序中用到的值。这个谜题中int足够了。下面是如何使用int值来表现cents的数值来重新写程序用println看结果。这个版本打印出90 cents这是个正确的结果。


這个版本不是非常漂亮因为java对BigDecimal提供no linguistic的支持。BigDeimal的计算都比那些使用原始数据类型的要慢这也许会是某些程序大量使用decimal计算时的问题。这昰大多数程序的重点

总而言之,需要精确结果时避免float与double;对于货币计算用int,long或BigDecimal。对于语言设计者考虑对BigDecimal运算提供linguistic支持。一个方法是提供对操作符重载提供有限支持这样一来运算符能够被用来与数字相关类型,如BigDecimal另一方法是提供十进制数的原始数据类型,就如同COBOL和PL/I中那样

1年前 已收到4个回答

共回答了21个问題采纳率: - 雨露学习互助 - 23

我要回帖

更多关于 int36等于 的文章

 

随机推荐