-8

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

给定两个数字:

numb1 = 0.000171438
numb2 = 11666;

如果我做

fillweight= float(numb1 * numb2)

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

fillweight = 0.000171438 * 11666

我在屏幕上正确得到“1.9999”答案 - 传入浮点数有什么问题?我也尝试过类似的东西

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

但他们总是相同的答案。

4

3 回答 3

2

fillweight = 0.000171438 * 11666

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

fillweight = 0.000171438f * 11666f

将与

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

如果 numb1 和 numb2 是floats。

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

于 2013-01-21T21:22:30.770 回答
0

浮点数的可用精度明显低于双精度数 - 在“有效”的情况下,文字被解释为双精度数。

很多关于这方面的信息可以在这里找到:

浮点数与双精度

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

于 2013-01-21T21:23:44.530 回答
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
于 2013-01-21T22:09:18.667 回答