确定双C++中的小数位数
Determining the number of decimal digits in a double - C++
我正在尝试获取双精度小数点后的位数。目前,我的代码如下:
int num_of_decimal_digits = 0;
while (someDouble - someInt != 0)
{
someDouble = someDouble*10;
someInt = someDouble;
num_of_decimal_digits++;
}
每当我为someDouble输入一个小于1的小数时,循环就会被卡住并无限重复。我应该使用static_cast吗?有什么建议吗?
由于浮点舍入错误,乘以10不一定是精确的十进制移位。您可以测试差值的绝对误差,而不是将其与0
进行精确相等的比较。
while (abs(someDouble - someInt) < epsilon)
或者,您可以确认,尾数为53位的双精度只能表示log10253≈15.9位小数,并将循环限制为16次迭代。
while (someDouble - someInt != 0 && num_of_decimal_digits < 16)
或者两者兼而有之。
while (abs(someDouble - someInt) < epsilon && num_of_decimal_digits < 16)
天真的答案是:
int num_of_decimal_digits = 0;
double absDouble = someDouble > 0 ? someDouble : someDouble * -1;
while (absDouble - someInt != 0)
{
absDouble = absDouble*10;
someInt = absDouble;
num_of_decimal_digits++;
}
这就解决了负数的问题。
然而,由于浮点数的表示方式,这种解决方案在很多情况下可能不会给您带来您想要的输出。例如,0.35可能真的表示为0.3499999999998,这是浮点数字以二进制存储的方式。我建议您分享更多关于您希望使用此代码实现的目标的背景信息(您的输入和期望的输出)。对于你试图实现的目标,可能有一个更好的解决方案。
相关文章:
- 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个除数的最小数?