首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java.math.BigDecimal除法不准确

问java.math.BigDecimal除法不准确
EN

Stack Overflow用户
提问于 2018-08-07 04:43:52
回答 2查看 3.5K关注 0票数 6

在Kotlin中,BigDecimal分部返回奇怪的结果。

代码语言:javascript
复制
BigDecimal(1.0) / BigDecimal(2.0)
// returns 0.0
// Just like Int(1) / Int(2) returns 0

但是:

代码语言:javascript
复制
BigDecimal(1.1) / BigDecimal(2.0)
// returns 0.55
// Just like Double(1.1) / Double(2.0) returns 0.55

那么,为什么会发生这种情况呢?如何使1.0 / 2.0在不使用divide()提供缩放参数的情况下使用BigDecimal返回0.5呢?

最新情况:

以下是完整的代码:

代码语言:javascript
复制
Welcome to Kotlin version 1.2.41 (JRE 1.8.0_172-b11)
Type :help for help, :quit for quit
>>> import java.math.BigDecimal
>>> BigDecimal(1.0) / BigDecimal(2.0)
0
>>> BigDecimal(1.1) / BigDecimal(2.0)
0.550000000000000044408920985006261616945266723632812

更新2:

@user2864740 2864740

代码语言:javascript
复制
BigDecimal(1.0).divide(BigDecimal(2.0))
// returns 0.5

和

代码语言:javascript
复制
BigDecimal("1.0") / BigDecimal(2.0)
// returns 0.5

所以结果令人困惑。对于BigDecimals,为什么1.0 / 2.0返回0.0,1.0.divide(2.0)返回0.5,"1.0" / 2.0返回0.5?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-07 05:08:57

如果您显式地编写divide,它的工作方式将与它在Java中的工作方式相同:

代码语言:javascript
复制
val a = BigDecimal(1.0)
val b = BigDecimal(2.0)
val x = a.divide(b) // 0.5

当您使用/运算符时,这将转换为标准库中的BigDecimal.div扩展,它执行以下操作:

为BigDecimal实例启用/运算符。 结果的比例与这个(除数)的标度相同,对于舍入,使用RoundingMode.HALF_EVEN舍入模式。

您可以查看不同的RoundingMode常量如何工作这里。

票数 6
EN

Stack Overflow用户

发布于 2018-08-07 05:08:45

1.1是一个double文本

如果浮点文字以字母F或f结尾,则为浮点数;否则它的类型为双,并且可以选择以字母d或d结尾。 https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

因此,当该值传递给BigDecimal时,由于double值,您已经失去了精度。BigDecimal(1.1)等同于double d = 1.1; BigDecimal(d)。您需要将值作为字符串传递。

代码语言:javascript
复制
BigDecimal("1.1")

除非该值完全可以表示为类似于1.5的双值

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51718960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档