在C++中乘以小数
Multiplying small numbers in C++
我在数字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
相关文章:
- C++将浮点指针值舍入为小数位数
- 从给定的 I 和 D 序列中形成最小数
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- 计算 PI 最多 42 位小数
- 为什么我必须添加一个小数才能在C++中正确计算此数学
- 返回浮点数的小数位数
- 为什么 std::cout 打印浮点数、双精度和长双精度到相同的小数精度?
- 在数学上将浮点数四舍五入到 N 位小数
- 打印双精度的整个非小数部分
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 如何在C++中对OpenCV垫的小数进行四舍五入?
- 将 int 数组转换为带有小数C++的双精度数组
- Arduino如何制作返回固定大小数组的函数
- 从浮点数中删除小数部分但保留类型的有效方法
- 分配新的零大小数组可以具有有效价值吗?
- c++只关心2位小数,没有设置精度
- 有没有一种方法可以在不设置精度的情况下设置小数位数
- gcc c++编译器中的零大小数组
- 给出了一个数的确切除数(n),如何确定具有n个除数的最小数?