Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在scala中比较Double常量和Doubleequals是否节省?_Scala_Floating Point_Precision - Fatal编程技术网

在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个标志,即双常量,而不仅仅是好/坏。