首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala和Java BigDecimal

Scala和Java BigDecimal
EN

Stack Overflow用户
提问于 2010-04-23 17:57:42
回答 6查看 30.8K关注 0票数 29

我想为我的应用程序中基于数学的模块从Java切换到脚本语言。这是由于mathy Java的可读性和功能限制。

例如,在Java中,我有以下内容:

代码语言:javascript
复制
BigDecimal x = new BigDecimal("1.1");
BigDecimal y = new BigDecimal("1.1");
BigDecimal z = x.multiply(y.exp(new BigDecimal("2"));

正如您所看到的,如果没有BigDecimal运算符重载,简单的公式很快就会变得复杂。

对于双精度,这看起来很好,但我需要精度。

我希望在Scala中我能做到这一点:

代码语言:javascript
复制
var x = 1.1;
var y = 0.1;
print(x + y);

在默认情况下,我会得到类似十进制的行为,可惜Scala默认不使用小数计算。

然后我在Scala中这样做:

代码语言:javascript
复制
var x = BigDecimal(1.1);
var y = BigDecimal(0.1);
println(x + y);

我仍然得到一个不精确的结果。

在Scala中有什么地方我做得不对吗?

也许我应该使用Groovy来最大化可读性(它默认使用小数)?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-04-23 18:01:48

我不知道Scala,但在Java语言中,new BigDecimal(1.1)用一个double值初始化BigDecimal,因此它并不完全等于1.1.在Java中,您必须使用new BigDecimal("1.1")。也许这在Scala中也会有所帮助。

票数 38
EN

Stack Overflow用户

发布于 2010-04-23 18:04:52

将您的Scala代码更改为:

代码语言:javascript
复制
var x = BigDecimal("1.1");   // note the double quotes
var y = BigDecimal("0.1");
println(x + y);

它将像在Java中一样工作。

票数 34
EN

Stack Overflow用户

发布于 2010-04-23 19:12:39

在这一点上,Scala绝对和Java是一样的。

根据Joachim的回答,编写val x = BigDecimal(1.1)

等同于写

代码语言:javascript
复制
val d : Double = 1.1
val x = BigDecimal(d)

当然,问题是双精度d已经有了舍入误差,所以你用错误的数据初始化了x。

使用接受字符串的构造函数,一切都会好起来的。

考虑到您的示例,您最好使用Scala s而不是vars,而且您也可以放心地在Scala中去掉分号。

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

https://stackoverflow.com/questions/2697638

复制
相关文章

相似问题

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