在C++中乘以小数

Multiplying small numbers in C++

本文关键字:小数 C++      更新时间:2023-10-16

我在数字C++遇到了这个问题:

给定两个数字:

numb1 = 0.000171438
numb2 = 11666;

如果我这样做

fillweight= float(numb1 * numb2)

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

fillweight = 0.000171438 * 11666

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

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

但它们总是相同的答案。

in

fillweight = 0.000171438 * 11666

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

fillweight = 0.000171438f * 11666f

将相同

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

如果 numb1 和 numb2 是 float s。

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

点数的精度明显低于双精度 - 在"工作"的浮点数中,文字被解释为双精度。

可以

在这里找到很多相关信息:

浮点数与双精度

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

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

#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