关于C ++乘法运算的困惑

时间:2014-02-21 16:30:04

标签: c++

以下让我感到困惑 -

如果你将float与10(integer)相乘,看看发生了什么, 这些类型的操作似乎也很奇怪!

#include <iostream>
using namespace std;

int main()
{
    float x1 = 0.1;// x1 *10 = 1  ture
    float x2 = 0.7;//x2 *10 = 7 false answer give 0.6
    float x3 = 0.8;//x3 *10 = 8 true
    float x4 = 0.9;// x4 * 10 = 9 false ops! the answer is 8
    int f  = x4 * 10 ;
    cout<<f ;

    return 0;
}

任何人都可以解释一下吗?

4 个答案:

答案 0 :(得分:3)

因为您尝试将结果保存到int,而不是float。这将关闭浮动部分,仅保留整数部分,例如(int) 6.999 = 6

如果你想获得 预期的 结果,你至少应该围绕它:

int f  = x4 * 10 + 0.5;
                 ^^^^^
                   | +0.5 here to round it

注意:由@JamesKanze评论,因为有multiple definitions of rounding+0.5 可能不适用于负数(使用{{1而不是)。为了让您的工作更轻松,自-0.5以来您还可以使用std:round()

或者将其保存为应有的内容,即C++11

float

P.S。:要继续阅读,请查看What Every Computer Scientist Should Know About Floating-Point Arithmetic

答案 1 :(得分:0)

你使用int作为f的类型,因此精度会丢失。试试:

float f = x4 * 10.0;

再试一次。

答案 2 :(得分:0)

浮点数总是向下舍入(13.999999是13作为int)。浮点运算会受到较小的舍入误差。试试这个:

int f  = (x4 * 10) + 0.5;

它只适用于正数,但证明了如何做这种事情。

答案 3 :(得分:-1)

浮点数不能完全代表数字。例如,考虑表达式 1/3

您要将乘法结果赋值为整数变量。在这种情况下,浮点数被截断,因为它的分数被抛弃。

改为使用

float f  = x4 * 10 ;