C++ 双精度整数乘法

C++ 双精度整数乘法,c++,C++,我有一双3.4的。然而,当我把它乘以100,它得到的是339而不是340。这似乎是由于双精度造成的。我怎样才能避开这件事 谢谢如果您需要全精度,您可能需要使用类似的方法。您可以使用两个整数并将小数部分乘以乘法器/10 例如 如果你真的想要小数点两边的精度。确实取决于应用程序。浮点值很少是精确的。不幸的是,在C中将浮点值强制转换为整数时,该值会向零舍入。这意味着如果您有339.999999,则强制转换的结果将为339 为了克服这个问题,您可以从该值中添加(或减去)“0.5”。在本例中,339.99

我有一双3.4的。然而,当我把它乘以100,它得到的是339而不是340。这似乎是由于双精度造成的。我怎样才能避开这件事


谢谢

如果您需要全精度,您可能需要使用类似的方法。

您可以使用两个整数并将小数部分乘以乘法器/10

例如


如果你真的想要小数点两边的精度。确实取决于应用程序。

浮点值很少是精确的。不幸的是,在C中将浮点值强制转换为整数时,该值会向零舍入。这意味着如果您有339.999999,则强制转换的结果将为339

为了克服这个问题,您可以从该值中添加(或减去)“0.5”。在本例中,339.99999+0.5=>340.499999=>340(转换为int时)


或者,您可以使用标准库提供的多种转换函数之一。

首先,发生了什么:

  • 3.4不能精确地表示为二进制分数。因此,实现选择可表示的最接近的二进制分数。我不确定它是否总是向零舍入,但在你的例子中,所代表的数字确实更小
  • 到整数的转换将截断,即使用具有较小绝对值的最近整数
  • 由于两个转换都偏向同一个方向,因此总是会出现舍入误差
  • 现在你需要知道你想要什么,但是你可能想要使用对称舍入,也就是说,找到最接近的整数,无论它是小还是大。这可以实现为

    #include <cmath>
    int round(double x) { std::floor(x + 0.5); } // floor is provided, round not
    
    #包括
    int round(双x){std::floor(x+0.5);}//提供了floor,而不是round
    

    int-round(双x){返回x<0?x-0.5:x+0.5;}
    

    我不能完全确定它确实是向零舍入的,所以如果您使用它,请验证后面的值。

    您没有值为3.4的double,因为3.4不是 可表示为双精度(至少在普通机器上,以及 大多数异国情调也一样)。你所拥有的是一些非常有价值的东西 接近3.4。在乘法之后,你有一些非常重要的值 接近340。但肯定不是399

    你在哪里看到399?我猜你只是 使用
    static\u cast
    将强制转换为
    int
    ,因为此操作 向零截断。其他行动可能会做什么 您需要:以固定格式输出,在 例如,十进制(在定义的实现中) 方式,但我知道的所有实现都使用循环到平衡 默认情况下);函数
    舍入
    舍入到最近的舍入 在一半的情况下远离零(但您的结果不会 任何接近一半的地方)。这是在中使用的舍入 商业应用

    真正的问题是你在做什么,这需要一个准确的答案 整数值。根据应用程序的不同,它可能会更复杂 适合使用
    int
    long
    ,将实际值缩放为 必要(即存储实际值的100倍,或 无论如何),或者某种十进制算术软件包
    使用
    double

    您的原始值可能是3.399999,您可以显示一些代码吗请…您没有3.4的double,因为该数字不能准确表示为double。这就是问题所在。你应该阅读“每个程序员都应该知道的关于浮点运算的知识”,只检查一个nit,但浮点值总是精确的。它们并不是你想要的价值。
    #include <cmath>
    int round(double x) { std::floor(x + 0.5); } // floor is provided, round not
    
    int round(double x) { return x < 0 ? x - 0.5 : x + 0.5; }