如何解决用C++计算小数部分的问题?
我是 C++ 的新手。我在用 C++ 计算小数部分时遇到了麻烦,这是示例和代码:
示例:
3.01: count of decimal part is 2
103.939: count of decimal part is 3
代码:
int result = 0;
double d = 4.01;
while(true) {
cout << "(int)d: " << (int)d << endl;
if(d == (int)d) break;
d *= 10;
cout << "d *= 10: " << d << endl;
result++;
}
cout << result << endl;
控制台:
int(d): 4
d *= 10: 40.1
int(d): 40
d *= 401
int(d): 400
d *= 10: 4010
int(d): 4009
...
4.01 会发生什么变化?当 double = 5.01 等时,同样奇怪的结果我知道这是将 DOUBLE 转换为 INT 时的精度问题,但我是真的很好奇当测试翻倍如 4.01、5.01 等时它是如何发生的。
另外,如何修改if状态以测试4.01正确?
解决方法
既然您的问题已在评论中得到解答,我将发布一种不同方法来计算十进制数字(by taking input as string
并将整个内容视为字符串操作)。
#include <iostream>
using namespace std;
int main()
{
string d;
cin>>d;
int flag=0,count=0,pos;
for(int i = 0 ; i < d.length() ; i++){
if(d[i]=='.'){
flag = 1;
pos = i; // for keeping the index of decimal point
continue;
}
if(flag==1){
count++;
}
}
// for removing trailing zeroes like 0.10000 is actually 0.1
if(flag==1){
for(int i=d.length()-1;i>pos;i--){
if(d[i]!='0'){
break;
}
if(d[i]=='0'){
count--;
}
}
}
cout<<count<<"\n";
return 0;
}
UPD 1.0
:按照 frank 要求的两倍输入。
#include <iostream>
using namespace std;
int main()
{
double num;
string d;
cin>>num;
d = to_string(num);
int flag=0,pos;
for(int i = 0 ; i < d.length() ; i++){
if(d[i]=='.'){
flag = 1;
pos = i; // for keeping the index of decimal point
continue;
}
if(flag==1){
count++;
}
}
// for removing trailing zeroes like 0.10000 is actually 0.1
if(flag==1){
for(int i=d.length()-1;i>pos;i--){
if(d[i]!='0'){
break;
}
if(d[i]=='0'){
count--;
}
}
}
cout<<count<<"\n";
return 0;
}
,
检查此代码。它对我有用。
int result = 0;
int f = 1;
double d = 4.01;
while((int)(d*f)!=d*f)
{
f*=10;
result++;
}
std::cout<<result;
输出:
2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。