- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码:
Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45).
scala> val z: BigDecimal = null
z: BigDecimal = null
scala> z == null
res0: Boolean = true
看起来不错。然而...
scala> import java.math.{BigDecimal => JBigDecimal}
import java.math.{BigDecimal=>JBigDecimal}
scala> val x: JBigDecimal = null
x: java.math.BigDecimal = null
在REPL中,赋值会抛出NPE:
scala> val y: BigDecimal = x
java.lang.NullPointerException
at scala.math.BigDecimal.toString(BigDecimal.scala:452)
at scala.runtime.ScalaRunTime$.scala$runtime$ScalaRunTime$$inner$1(ScalaRunTime.scala:324)
at scala.runtime.ScalaRunTime$.stringOf(ScalaRunTime.scala:329)
at scala.runtime.ScalaRunTime$.replStringOf(ScalaRunTime.scala:337)
at .<init>(<console>:10)
at .<clinit>(<console>)
at $print(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
使用惰性变量会出现我主要担心的问题。
scala> lazy val y: BigDecimal = x
y: BigDecimal = <lazy>
scala> y == null
res1: Boolean = false
有什么建议吗?最后的比较是一个错误吗?我考虑过将这两个元素包装在选项中,但我首先想了解为什么会发生这种情况。
此外,比较这两个 BigDecimal 还会导致另一个(可能不同,但相关)异常
scala> z == y
java.lang.NullPointerException
at scala.math.BigDecimal.toLongExact(BigDecimal.scala:411)
at scala.math.BigDecimal$$anonfun$isValidLong$1.apply$mcV$sp(BigDecimal.scala:196)
at scala.math.BigDecimal.noArithmeticException(BigDecimal.scala:211)
at scala.math.BigDecimal.isValidLong(BigDecimal.scala:196)
at scala.math.BigDecimal.equals(BigDecimal.scala:190)
at scala.runtime.BoxesRunTime.equalsNumNum(BoxesRunTime.java:168)
我以前经常使用断言来获得更有趣的结果
重新设计的更具体的示例:
test("Both cases should be true") {
val x: JBigDecimal = null
val y: JBigDecimal = null
x should be (null)
y should be (null)
x == y should be (true)
val i :BigDecimal = x
val j :BigDecimal = y
i == j should be (true)
}
但是,比较 i == j 时失败
此外,即使使用选项,通过隐式将 JBigDecimal 转换为 BigDecimal,我仍然得到 BigDecimal(null) 实例。
我测试了这个错误报告,当我运行 BigDecimalBug 时,断言失败。
到目前为止,我复制的唯一可以正常工作的方法如下:
it("test implicit conversions from null Java BigDecimal to Option[BigDecimal]"){
val x: JBigDecimal = null
val y: JBigDecimal = null
x should be (null)
y should be (null)
x == y should be (true)
val i :BigDecimal = x
val j :BigDecimal = y
implicit def convertJBigDecimalOption(javaBigDecimal: JBigDecimal): Option[BigDecimal] =
Option(javaBigDecimal) map { x => BigDecimal(x.toString) }
val p :Option[BigDecimal] = x
val q :Option[BigDecimal] = y
p should be('empty)
q should be('empty)
}
最佳答案
发生 NullPointerException
是因为 REPL 在 val 赋值之后调用 toString()
,这会引发异常。这就是为什么它不使用延迟求值抛出异常,因为它当时不调用 toString()
。
scala.math.BigDecimal
是一个包含 java.math.BigDecimal
的类,但是 scala.math.BigDecimal
的实例持有空值本身并不是空引用。在您的示例中 (y.bigDecimal == null)
将计算为 true。
无论如何,Option
的创建都是有原因的,使用它而不是分配和检查 null 是一个更好的主意。
编辑:
做这样的事情:
val x : java.math.BigDecimal = null
BigDecimal(x) == BigDecimal(x)
.. 将抛出 NullPointerException
因为 BigDecimal
将不可避免地调用此:
def compare (that: BigDecimal): Int = this.bigDecimal compareTo that.bigDecimal
.. 比较包装的 java.math.BigDecimal
,并且 compareTo
在发现 null 时抛出异常。
关于java - 与 Java BigDecimal 比较 null BigDecimal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21527555/
当你做这样的事情 BigDecimal bigDecimal = BigDecimal.ONE; 为什么bigDecimal成为一个新对象? 最佳答案 在这种情况下,变量(或字段)bigDecimal
我正在使用 BigDecimal 计算一些大实数。虽然我尝试了两种方法:BigDecimal.toString() 或 BigDecimal.stripTrailingZeros().toString
我广泛使用 BigDecimals。我经常需要进行长时间的计算,然后比较结果。由于这些漫长的计算,答案不是 1而是0.9999999... 。这就是为什么我无法精确比较 BigDecimals,而只能
我有一段代码有两个 BigDecimal 变量。这两个变量都被发送到方法格式(工作正常)然后打印。变量“d”被发送到格式方法,然后直接打印而不分配它(因为格式方法返回一个字符串)。问题出现在变量 a
我遇到过 java.math.BigDecimal 和 android.icu.math.BigDecimal 因为我需要在项目中使用 BigDecimal . 我意识到 Android BigDec
我在整个应用程序中使用 BigDecimal 来处理金钱 和百分比。但是,我需要一种方法来区分两者之间的用法(为了呈现它们,即在 JTable 中)。因此,我最初的想法是编写两个行为与 BigDeci
这应该很简单,但它正在爆炸。有什么想法吗? d = BigDecimal.new("2.0") YAML::load({:a => d}.to_yaml) TypeError: BigDecimal
我有两个 BigDecimal,我想根据它们的 significant digits 确定它们是否接近。 . 例如,请考虑以下内容: BigDecimal million = new BigDecim
我需要一种方法将其表达为有效的java代码:我有2个BigDecimals,我想知道较小的BigDecimal是否可以(当添加到较大的BigDecimals时) BigDecimal 一次)更改较大
我正在争论是使用 BigDecimal 和 BigInteger 还是仅使用 BigDecimal 来让我的生活更轻松,减少来回转换。在资源方面仅使用 BigDecimal 有缺点吗? 仅使用原始数据
我有以下代码: Welcome to Scala version 2.10.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_45). scala> v
我有一个 java 客户端,它通过 GRPC 调用 Clojure 服务。问题是,当我们从他们的服务收到响应时,它会在大十进制的末尾添加字母。当我们尝试在 java 中将其转换为大十进制时,我们会收到
我仍在学习 Java,并且一直在阅读多个站点上的文章。我在 Java Code Geeks 找到了一篇文章我有一个问题。该文章正在解释开放/封闭原则。本文以对公司产品应用折扣的场景为例。第一部分代码如
我正在尝试对 List 中的多个 BigDecimals 求和.目前,我正在使用两个流,但如果可能的话,我希望只有一个流。我不确定如何以高效的方式重写下面的内容。 BigDecimal totalCh
下面两行代码有什么区别? BigDecimal one = new BigDecimal("1"); BigDecimal two = BigDecimal.ONE; 两条线是否相同? 谢谢! 最佳答
这个问题在这里已经有了答案: BigDecimal from Double incorrect value? (4 个答案) Convert double to BigDecimal and set
在 Java 中,来自另一个 bigDecimal.toString() 的新 BigDecimal 是否总是等于?例如 BigDecimal a = new BigDecimal("1.23
对于新变量的比较或初始化,您使用其中的哪一个会有所不同吗? 我知道 BigDecimal.ZERO 是 1.5 的功能,所以这是一个问题,但假设我使用的是 1.5,这有关系吗? 谢谢。 最佳答案 Bi
情况: public static double pi(int a) { return (BigDecimal.valueOf(53360*sqrt(640320))).divide(co
我正在尝试创建一个可以在 diesel 中用于插入的结构。具体来说,我正在使结构可插入。编译时出现此错误。 我有一个结构,我正试图通过 derive 属性使 Insertable 成为可能。我有一个名
我是一名优秀的程序员,十分优秀!