我想为我的应用程序中基于数学的模块从Java切换到脚本语言。这是由于mathy Java的可读性和功能限制。
例如,在Java中,我有以下内容:
BigDecimal x = new BigDecimal("1.1");
BigDecimal y = new BigDecimal("1.1");
BigDecimal z = x.multiply(y.exp(new BigDecimal("2"));正如您所看到的,如果没有BigDecimal运算符重载,简单的公式很快就会变得复杂。
对于双精度,这看起来很好,但我需要精度。
我希望在Scala中我能做到这一点:
var x = 1.1;
var y = 0.1;
print(x + y);在默认情况下,我会得到类似十进制的行为,可惜Scala默认不使用小数计算。
然后我在Scala中这样做:
var x = BigDecimal(1.1);
var y = BigDecimal(0.1);
println(x + y);我仍然得到一个不精确的结果。
在Scala中有什么地方我做得不对吗?
也许我应该使用Groovy来最大化可读性(它默认使用小数)?
发布于 2010-04-23 18:01:48
我不知道Scala,但在Java语言中,new BigDecimal(1.1)用一个double值初始化BigDecimal,因此它并不完全等于1.1.在Java中,您必须使用new BigDecimal("1.1")。也许这在Scala中也会有所帮助。
发布于 2010-04-23 18:04:52
将您的Scala代码更改为:
var x = BigDecimal("1.1"); // note the double quotes
var y = BigDecimal("0.1");
println(x + y);它将像在Java中一样工作。
发布于 2010-04-23 19:12:39
在这一点上,Scala绝对和Java是一样的。
根据Joachim的回答,编写val x = BigDecimal(1.1)
等同于写
val d : Double = 1.1
val x = BigDecimal(d)当然,问题是双精度d已经有了舍入误差,所以你用错误的数据初始化了x。
使用接受字符串的构造函数,一切都会好起来的。
考虑到您的示例,您最好使用Scala s而不是vars,而且您也可以放心地在Scala中去掉分号。
https://stackoverflow.com/questions/2697638
复制相似问题