在scala中比较Double常量和Doubleequals是否节省?
我在一个代码中工作,将双值与一个预定义的常量进行比较,该常量标记缺少的值。该值的使用方式是,如果变量不满足某些要求,则将其分配给此处输入的变量:在scala中比较Double常量和Doubleequals是否节省?,scala,floating-point,precision,Scala,Floating Point,Precision,我在一个代码中工作,将双值与一个预定义的常量进行比较,该常量标记缺少的值。该值的使用方式是,如果变量不满足某些要求,则将其分配给此处输入的变量: val BAD = -9999.9 val verified = if(isQualityOk(input)) input else BAD 随后在应用程序中,再次检查数字是否正确: if(!myNumber.equals(BAD)) { // do something with it } 我知道,使用equals比较浮点/双精度值通常是一个
val BAD = -9999.9
val verified = if(isQualityOk(input)) input else BAD
随后在应用程序中,再次检查数字是否正确:
if(!myNumber.equals(BAD)) {
// do something with it
}
我知道,使用equals比较浮点/双精度值通常是一个坏主意,因为舍入误差有限,机器精度有限,因此建议在一定限制下比较它们差值的绝对值
我的问题是:在我上面的例子中,并没有对数字进行算术运算,这也是必要的吗?或者在这种情况下使用Doubleequals的实现安全吗 如果没有计算,那么除了从十进制数到二进制数的转换之外,没有任何地方会失去精度。 所以你应该很好
话虽如此,由于您提到的响应,2-3版本的代码会产生一些微妙的错误,因此如果这段代码包含的代码应该在长期内保持可行,我会重新安排使用更安全的数据类型,听起来应该是布尔值,否?如果不对双精度浮点运算,应该可以 然而,这不是函数式编程中处理特殊情况的方式 这样做可能更为明确:
val verified: Option[Double] = Some(input).filter(isQualityOk)
因此,类型系统告诉您,您不确定是否有一个有效值,如果质量不正常,则该值将为“无”
如果您通常对verified应用函数fd:Double:T,只需执行verified.mapf即可获得选项[T],并继续执行
无论何时需要实际值,您都可以通过执行verfied.getOrElseBAD返回到Double,但最好尽可能长时间保留例外情况,以便类型系统可以帮助您避免一些错误。谢谢!我完全知道这不是功能性的,我只是在检查现有的代码。我的例子也被简化了,有超过1个标志,即双常量,而不仅仅是好/坏。