java里双或_java – 为什么不使用双或浮动来表示货币?

因为浮动和双打不能准确表示我们用于钱的基数10倍数。这个问题不仅仅针对Java,而是针对使用本地浮点类型的任何编程语言,因为它源于计算机在默认情况下处理浮点数。

这是一个IEEE-754浮点数如何工作:它专用一个位为符号,几个位存储基数的指数,其余的为升高的基数的倍数。这导致诸如10.25的数字以类似于1025 * 10-2的形式表示;除了基础是10,浮动和双打,它是两个,所以将是164 * 2-4。 (这仍然不是他们在硬件中表示,但这是很简单,数学保持同样的方式。)

即使在基数10中,这种表示法也不能精确地表示最简单的分数。例如,对于大多数计算器,1/3导致重复的0.333333333333,与数字显示允许的数量一样多,因为你不能用十进制记数法写入1/3。然而,为了货币的目的(至少对于货币价值在美元的数量级的国家),在大多数情况下,你需要的是能够存储10-2的倍数,所以我们不真的关心如果1/3没有一个正整数乘以10的幂的精确表示,甚至最便宜的计算器处理美分。

浮动和双打的问题是,绝大多数类似金钱的数字没有一个整数乘以2的幂的精确表示。事实上,0/100和100/100之间的一百分之一(在处理货币时是重要的,因为它们是整数美分)可以精确地表示为IEEE-754二进制浮点数,为0, 0.25,0.5,0.75和1.所有其他的都少量关闭。

将货币表示为双或浮动可能看起来很好,因为软件舍弃了​​微小的错误,但是当您对不精确的数字执行更多的加法,减法,乘法和除法时,错误加法将失去越来越多的精度向上。这使得浮动和双倍不足以处理货币,其中需要基数为10的倍数的完美准确度。

一个工作在任何语言的解决方案是使用整数,而不是计数。例如,1025将是$ 10.25。几种语言也有内置类型来处理钱。其中,Java有BigDecimal类,而C#有decimal类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值