如何计算出大双精度中有多少个十进制数字
How to figure out how many decimal digits are in a large double?
嘿,所以我正在创建一个函数,该函数返回小数,整数或总数,但无法使其使用以下任何一种方式工作:
- 乘以
像 100 亿这样的大数字是行不通的,因为计算机存储小数的天真方式,使 2.3 2.2999575697
使用 StringStream 将数字转换为字符串并计算字符数不起作用,因为它需要您将流设置为一个精度,如果未设置为实际的小数位数,则删除或添加不必要的"0"字符
那我现在该怎么办? 有人请帮忙=( 谢谢!
如果您想查看将麻木转换为字符串的函数,这里是:
////////////////////// Numbs_Digits ////////////////////////////////////////////////
template<typename T>
int Numbs_Digits(T numb, int scope)
{
stringstream ss(stringstream::in| stringstream::out), ss2(stringstream::in| stringstream::out);
unsigned long int length= 0;
unsigned long int numb_wholes;
ss2 << (int)numb;
numb_wholes = ss2.str().length(); ss2.flush();
bool all= false;
ss.precision(11); // HOW DO I MAKE THE PRECISION NUMBER THE NUMBER OF DECIMALS?
switch(scope){
case ALL: all = true;
case DECIMALS: ss << fixed << numb;
length += ss.str().length()- (numb_wholes +1); // +1 for the "."
if(all!= true) break;
case WHOLE_NUMBS:
length += numb_wholes;
if(all!= true) break;
default: break;}
return length;};
如果您想知道long double
可以存储的最大十进制位数,此值在 cfloat
中定义的常量LDBL_DIG
中可用。 请注意,此数字实际上是一个近似值,因为值在内部以二进制形式存储,因此值的范围不是 10 的幂。
只有一些十进制数可以精确地存储为浮点数。因此,无法确定对于任何不成立的十进制数,有多少小数位是有效的。正如 hammar 所建议的,阅读浮点存储格式,我相信每个程序员都应该对像这样的低级东西有一些了解:D
乘以像 100 亿这样的大数字是行不通的,因为计算机存储小数的天真方式,使 2.3 2.2999575697
这正是问题所在。你能看看 2.999575697 并告诉我它有两个小数位吗?此数字是十进制数的示例,该十进制数无法使用浮点格式以精确形式存储。你能做的最好的事情就是计算浮点数中存储的有效小数位,最接近给定的原始十进制数 - 我无法想象这会有多大用处。
编辑以获得更准确的解释。
您能否将ios_base
精度设置为平台上有效位数的最大小数cfloat.h
,然后使用 ios_base::setf()
将浮点格式更改为科学格式,这将从浮点数中删除任何尾随零(您只需将指数从末尾修剪)?
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*
- 为什么我的数组双精度函数不起作用?
- 高精度双精度的 Sprintf 格式化问题
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 将指针数组分配给双精度
- 双精度和超长整数的精度差是多少
- 如何计算出大双精度中有多少个十进制数字