我需要比较两个双精度的整数部分的不等式,我现在正在这样做:
int iA = (int)dA;
int iB = (int)dB;
if( iA != iB )
{
...
}
但我想知道是否有比这更好的方法。
感谢。
如果我使用Math.Truncate()而不是使用强制转换为int,那么比较两个得到的双精度值是否仍然准确?
关于匈牙利符号评论:
我自己从未使用过HN,至少与大多数人的做法无关。但这是一种罕见的情况,其中变量的语义与其类型直接相关。我本可以选择另一种语法,如A_As_Integer和B_As_NonInteger,但那会有什么不同呢?
答案 0 :(得分:7)
使用Math.Truncate()即
if (Math.Truncate(x) == Math.Truncate(y))
[编辑]意识到如果你要比较双精度的整数部分,如果你的双精度超出了可以表示为int的范围,那么转换为int值会首先冒溢出的风险。
Truncate返回Decimal或double,避免了这个问题。
答案 1 :(得分:4)
是的,这是最好的方法。
假设你在问题中的措辞,你不担心四舍五入...只是整数部分本身。
即。 (int)4.1将给出与(int)4.9
相同的结果正如Ovid所说,如果您只需要变量进行比较,那么您只需要在比较语句中转换双精度数。我只关注这个理论。
答案 2 :(得分:1)
就个人而言,除非我需要,否则我会尽量避免创建额外的变量。
if ( (int)dA != (int)dB ) {
...
}
随着代码的发展,随着时间的推移,额外的变量无意中会导致混淆。当然,如果您需要这些变量,那就是另一个问题:)
旁注:您似乎试图通过简单的匈牙利表示法来暗示数据类型。我可以建议不这样做吗?如果必须为变量添加前缀信息,请尝试为变量的前缀添加前缀,而不是其类型。如果这样做,代码中的错误可以更容易看到:
if ( (int)ageA != (int)idB ) {
...
}
在这种情况下,甚至不知道数据是什么,看到你试图将'年龄'与'id'进行比较是一个很好的线索,这里有些问题。
答案 3 :(得分:1)
我同意Truncate就是你想要的。
来自MSDN的一些有用信息:
Truncate返回丢弃任何小数位后剩余的数字。
它向最接近的整数舍入为零。
double floatNumber;
floatNumber = 32.7865;
// Displays 32
Console.WriteLine(Math.Truncate(floatNumber));
floatNumber = -32.9012;
// Displays -32
Console.WriteLine(Math.Truncate(floatNumber));