2013-05-30 38 views
0

我移植一个Java应用到C#,使得使用的.NET双d == double.MaxValue

double x; 

if (x == null) blah blah 

double S IN的.Net不可为空所以这需要改变。没什么大不了。

测试浮点数是否相等是很不好的做法。所以,如果我初始化变量

double d = double.MaxValue; 

,后来想测试

if (d == double.MaxValue) blah blah 

是这有效吗?假设d没有被赋予新的价值,我是否保证测试总是会返回true?

+4

Java中的双打也不可空。 –

+2

如果'null'对于'x'确实是一个有效的状态,那么它应该是'Nullable '类型的? – David

回答

4

在Java中是空的,因为它是一个类,因此是一个参考类型,其中 a double。您应该在C#中使用Nullable<double>double?(两者在技术上都是相同的)。 Nullable<T>是.NET值类型的通用“框包装器”。

+0

使用这两者中的任何一个都会对性能产生影响吗?似乎我的解决方案应该有最好的表现,因为它避免拳击? –

+0

@bogusman是的,'Nullable '也是GC的实际对象和主题。一个普通的.NET-'Double'处理类似于*(大致)的原始Java'double'。取决于很多事情的影响是多么糟糕,虽然... –

+0

@bogusman Wormbo的解决方案(http://stackoverflow.com/a/16844678/17713)也许会更快更正确,除非'double.MaxValue'可能永远是一个计算的非空值。然而,'double?'将更好地表达变量的可能空语义。最好的选择将取决于你的项目更重要的是什么。 –

2

检查浮点值对于您之前分配的某个常量没有任何问题。

有关浮点数和平等比较的臭味部分试图比较计算值或计算值和常数 - 由于舍入误差可能会失败。

+0

+1为计算与常量的区别 –