首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.Truncate(num)的问题

Math.Truncate(num)的问题
EN

Stack Overflow用户
提问于 2013-09-06 10:40:03
回答 2查看 266关注 0票数 3

正如问题所暗示的(更像是一个声明,抱歉),我在C#中使用math.truncate时遇到了问题。我想说的是,当一个数字的十进制数除以50等于0.4时,这样做:

代码语言:javascript
复制
double temp2 = 170;    
temp2 = temp2 / 50;   //this equals 3.4
temp2 -= Math.Truncate(temp2);
if (temp2 == 0.4)
{
    Console.WriteLine("Hello");
}

然而,当我尝试这样做时,它对我来说不起作用,我不确定为什么它不起作用,我能得到一些关于这一点的解释,并将我带到正确的方向吗?

EN

回答 2

Stack Overflow用户

发布于 2013-09-06 10:42:24

singledouble是二进制浮点类型。这意味着它们不能精确地表示许多十进制值(如0.4)。这可能会导致细微的舍入错误,因此比较逻辑上应该表示相同值的两个double值可能会导致意外的结果。

这可以使用DoubleToInt64Bits方法进行经验验证:

代码语言:javascript
复制
BitConverter.DoubleToInt64Bits(temp2); // 4600877379321698712
BitConverter.DoubleToInt64Bits(0.4);   // 4600877379321698714

将其更改为decimal,您将获得预期的结果:

代码语言:javascript
复制
decimal temp2 = 170;    
temp2 = temp2 / 50;   //this equals 3.4
temp2 -= Math.Truncate(temp2);
if (temp2 == 0.4m)    // the m creates a decimal constant
{
    Console.WriteLine("Hello");
}
票数 4
EN

Stack Overflow用户

发布于 2013-09-07 23:02:33

当你减去浮点数中最重要的部分时,因为与被减数相比,减法结果具有较小的幅度,所以在该结果中存在许多额外的“人工”精度。由于原始数字没有精确表示(二进制浮点几乎总是如此),这种额外的精度看起来就像垃圾。

举一个更极端的例子(原则上是一样的):

代码语言:javascript
复制
double x = 987654321098.4 - 987654321098.0;
// x becomes 0.4000244140625

在这里,数量级发生了很大变化。在原始示例中:

代码语言:javascript
复制
3.4 - 3.0

结果,大约。0.4,仍然不到约八分之一。3.4,所以这里有三个额外的精度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18649020

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档