求小数位数 急

李万鹏 2010-03-21 03:56:54
输入6位的小数(共六位 包括整数部分 小数点 小数部分) 求小数位数 测试数据 95.123 1.0100 0.4321 求c++ 程序
...全文
773 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
fply_163 2010-11-30
  • 打赏
  • 举报
回复
怎么看不到25楼?是需要回复?
zy_cl 2010-03-22
  • 打赏
  • 举报
回复
输入 是float 型的
eg. float = 1.0100 求小数位数
WizardOz 2010-03-21
  • 打赏
  • 举报
回复
不用库函数貌似很难哦
关键浮点数是怎么存储的不太清楚。

用库函数就简单拉,用snprintf打印为字符串,然后再来分析。
fordfamily 2010-03-21
  • 打赏
  • 举报
回复
建议:

num=length(split((string)cin(input))))
耍宝王 2010-03-21
  • 打赏
  • 举报
回复
用float 和 double存储的数据,实际精度都是不足的
比如:float型存储1.0100,实际存储可能为1.009999999 只能保证在四舍五入处理后有6位有效数字,同样,double型能保证至少10有效数字

因此,运用普通的数学计算并不精确,需要额外处理。我的想法如下:
一、确定小数部分的有效数字有几位:就是用实际类型有效位数减去整数部分有效数字,比如float型存储1.0100 那就是 6 - 1 小数能保证的精度为 5 位。如果整数部分为 0 ,那就是查找小数点后第一个非 0 值,而后加上实际类型有效位数,比如0.4321,那就是 6

二、四舍五入保证小数部分的精度:实际就是在小数精度位数之后那位加上 5 ,比如float型存储1.0100实际存储可能为1.009999999 ,确定小数能保证的精度为 5 位,那就加上0.000005 那实际存储可能为1.010004999 即小数点后第 6 位之前(不包括第 6 位)为理想数值

三、以小数点后第 5 位为起点,前查找,确定最后一个非 0 值,也就是小数点后的位数
大致代码如下:
#include <iostream>
using namespace std;

int pow(int n)//pow为计算10的count次方的函数,count为负时除了方法等同于为0时
{
int i = 10;

if(0 < n)
{
while(--n)
i *= 10;
}
else
i = 1;

return i;
}

int main()
{
float a, b = 0.5;//0.5用于计算上的四舍五入

cout << "输入(float只能确保6位有效数字):";
cin >> a;

/**计算小数部分的有效数字位数*/
int num = a;//取整数部分
int count = 0;

while(num)//确定整数部分的有效数字
{
++count;
num /= 10;
}

//确定小数位数的有效数字
if(0 != count)//整数部分不为 0
count = 6 - count;
else //如果整数部分为 0
{
float tmp = a * 10;
num = tmp;

while(!num)
{
++count;
tmp *= 10;
num = tmp;
};

count += 6;
}

/**四舍五入保证小数部分的精度*/
num = pow(count);//pow为计算10的count次方的函数,count为负时除了方法等同于为0时
b /= num;

if(0 <= a)//四舍五入计算
a += b;
else
a -= b;

/**计算小数位数*/
num *= a;//a * 10^count

while(0 == num % 10)
{
num /= 10;
--count;
}

/**输出*/
cout << "小数位数为:" << count << endl;
return 0;
}
jbz001 2010-03-21
  • 打赏
  • 举报
回复
以字符类型输入,然后检测有无其他字符或多余的符号,最后统计字符长度。
woaigaoxinyu 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 thefirstz 的回复:]
引用 24 楼 woshixingaaa 的回复:
3楼的 1.0100求不出来阿

刚才考虑不周,现在这个应该能用了
C/C++ code
#include<iostream>
using namespace std;

int main()
{
string s;
unsigned int i=0;
int num = 0;
getline(cin,s……
[/Quote]

UP
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
多谢 25楼 呵呵
昵称很不好取 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 woshixingaaa 的回复:]
3楼的 1.0100求不出来阿
[/Quote]
刚才考虑不周,现在这个应该能用了
#include<iostream>
using namespace std;

int main()
{
string s;
unsigned int i=0;
int num = 0;
getline(cin,s);
while(s[i]!='.' && i<s.size()){
++i;
}
if(i == s.size())
num = 0;
else{
int j = s.size() - 1;
num = s.size()-i-1;
while(s[j--] == '0')
num--;
}

cout<<num<<endl;
return 0;
}
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
3楼的 1.0100求不出来阿
昵称很不好取 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 woshixingaaa 的回复:]
那怎么计算95.123 的小数点位数阿
[/Quote]
我三楼代码就可以,可你非要cin>>a
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
那怎么计算95.123 的小数点位数阿
昵称很不好取 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 woshixingaaa 的回复:]
用95.123测试怎么是6而不是3呀
[/Quote]
浮点数存储有偏差,你输入95.123,但存储在a里面可不是95.123,我打印了下是95.123001
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
http://acm.pku.edu.cn/JudgeOnline/problem?id=1001
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
用95.123测试怎么是6而不是3呀
lecoo 2010-03-21
  • 打赏
  • 举报
回复
如果你要用C/C++写的话当然是用整型数组存了
题目地址发出来
昵称很不好取 2010-03-21
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
using namespace std;

int main()
{
float a;
char c[10];
int i = 0, j = 0, num = 0;
cin>>a;
sprintf(c,"%f",a);
while(c[i++]!='.')
;
j = strlen(c)-1;
while(c[j] == '0')
--j;
num = j - i + 1;
cout<<num<<endl;
return 0;
}
fight_flight 2010-03-21
  • 打赏
  • 举报
回复
用string存
李万鹏 2010-03-21
  • 打赏
  • 举报
回复
r的n次幂 1.0100 的 12次幂 咋存阿
lecoo 2010-03-21
  • 打赏
  • 举报
回复
大数乘法?还是除法?乘法怎么会产生小数?还是高精度小数乘法?不管是哪个,都不应该用float型存储
加载更多回复(13)

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧