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