前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >能买几颗糖??

能买几颗糖??

作者头像
小尘哥
发布2018-08-15 10:44:34
9230
发布2018-08-15 10:44:34
举报
文章被收录于专栏:小尘哥的专栏小尘哥的专栏

最近这几天吃“瓜”有点多,这次我们换点糖吃。

01

Q:假设你有1块钱,而糖果五毛钱一颗,你买了一个,还剩多少钱?

A:必须剩五毛。(我们都是幼儿园毕业了的人)

程序实现:

02

Q:又来买糖,兜里装了一块零一分,即(¥1.01),,糖果也涨价了,变成0.56元一个,问买一个之后兜里还剩多少钱?

A:1.01-0.56=0.45(元)(都说了幼儿园毕业了)

程序实现:

WTF!!!什么鬼???

对的,你没看错,程序计算你还有0.449999999996元,为什么会这样???

假如代码欺骗了你,不要悲伤,不要心急,找出bug,解决之!

03

Q:闲着没事儿老想吃糖,又去买糖,这次为了方便计算,就装了一块钱,到了糖果店,货物架上摆着的糖果分别一毛一个,两毛一个,三毛一个······一样买一个的话最多能买几个?

A:都说了劳资是上过幼儿园的,当然从最便宜的买,0.1+0.2+0.3+0.4=1(元)刚好花完回家。

程序实现:

WTF!!!

竟然才买三个,为啥最后钱不够了???

05

摘自网络的一段:

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,由于最左为1的一位省略了,这意味着最多能表示8位数: 2*8388608 = 16777216 。有8位有效数字,但绝对能保证的为7位,也即float的精度为7~8位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为16~17位

因此,上面的糖果问题就是double搞的鬼,同样在《effictive java》中,精度丢失也被列为78条规则中的一条,那就是如果对精度要求较高特别是涉及money的时候,一定不要使用float和double。

06

Q:既然不能使用double,那该用什么来解决买糖果的问题?

A:如果数字可能会比较大,可以使用BigDecimal;如果金额较小,确保不会超过int大小的话使用int也可以(单位为分即可)

代码实现如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-01-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 陌与尘埃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档