【问题标题】:static_cast confusion caused by inconsistencies不一致导致的static_cast混淆
【发布时间】:2010-09-23 17:03:47
【问题描述】:

为什么每当我在 Visual Studio 2008 中编译和运行以下代码时:

double value1 = 10.5;
double value2 = 15.5;
int whole_number = value1 + value2;
Console::WriteLine(whole_number);

答案是 25,但我得到了一个错误的值 26。

但是,当我对双打使用静态强制转换时,我得到的正确答案是 25。

错误的输出如何解释?

【问题讨论】:

    标签: c++ casting double int


    【解决方案1】:

    完全正确。

    double value1 = 10.5;
    double value2 = 15.5;
    int whole_number = value1 + value2; // int whole_number = 26.0;
    Console::WriteLine(whole_number);
    

    你会期待什么?编译器首先计算右侧,然后隐式转换为 int。因此,26.0 变为 26

    当你在添加之前先投射,那么你将添加1015,结果是25 :)

    【讨论】:

      【解决方案2】:

      实际上,在进行自动转换时,您不能依赖浮点数来舍入任何一种方式。如果 26.0 用 26.00005 表示,则四舍五入为 26,如果用 25.999995 表示,则四舍五入为 25。如果要确定,请使用标准 C 函数 round,在 math.h 中定义。说因此,26.0 变为 26 并不完全正确。

      【讨论】:

      • 如果它 26.0,那么它会变成26。这是非常正确的。但如果它是 25.999995,正如你所说,它是 25,正如你所说。
      • 不过,原则上您确实是对的。 static_cast(val + 0.5) 解决了这个问题。 (圆形是c99,在c++中不可用)
      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      相关资源
      最近更新 更多