在C ++中乘以小数

时间:2013-01-21 21:21:01

标签: c++

我在C ++中遇到了这个带有数字的问题:

给出两个数字:

numb1 = 0.000171438
numb2 = 11666;

如果我这样做

fillweight= float(numb1 * numb2)

我得到答案“1”,而如果我这样做

fillweight = 0.000171438 * 11666

我在屏幕上正确地得到了“1.9999”答案 - 传递花车有什么问题?我也试过像

这样的东西
fillweight = float(float(numb1) * float(numb2))

但他们总是一样的答案。

3 个答案:

答案 0 :(得分:2)

fillweight = 0.000171438 * 11666

第一个数字是double常量,乘法使用双精度算术完成(11666将转换为double)这可能在编译时发生。

fillweight = 0.000171438f * 11666f

相同
fillweight = float(float(numb1) * float(numb2))

如果numb1和numb2是float s。

虽然这不能解决您的问题。但是,如果没有最小的工作示例,除了要注意你的类型之外没有什么可说的。

答案 1 :(得分:0)

浮动的可用精度明显低于双打 - 在"工作的时候#34;文字被解释为双打。

有很多关于此的信息可以在这里找到:

float vs. double precision

仔细检查浮子可以容纳的东西 - 这种差异可能不是导致你的问题的原因。我敢打赌,问题在于您尝试保存结果的变量可能是int或其他一些不适合的类型,用于执行乘法。

答案 2 :(得分:0)

您可能会在输出方法中看到舍入。例如,请使用以下代码:

#include "stdafx.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
    std::cout.precision(5);
    std::cout << "Precision(5)" << std::endl;
    {
    float numb1 = 0.000171438;
    float numb2 = 11666;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #1: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    {
    float numb1 = 0.000171438;
    float numb2 = 9999;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #2: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    std::cout.precision(10);
    std::cout << "Precision(10)" << std::endl;
    {
    float numb1 = 0.000171438;
    float numb2 = 11666;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #3: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }
    {
    float numb1 = 0.000171438;
    float numb2 = 9999;
    float fillweight = float(numb1 * numb2);
    std::cout << "Test #4: fillweight = " << fillweight << " numb1 = " << numb1 << " numb2 = " << numb2 << std::endl;
    }

    int i;
    std::cin >> i;
    return 0;
}

你会得到这个输出:

Precision(5)
Test #1: fillweight = 2 numb1 = 0.00017144 numb2 = 11666
Test #2: fillweight = 1.7142 numb1 = 0.00017144 numb2 = 9999
Precision(10)
Test #3: fillweight = 1.999995708 numb1 = 0.0001714380051 numb2 = 11666
Test #4: fillweight = 1.714208603 numb1 = 0.0001714380051 numb2 = 9999