首页 > 解决方案 > 用 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?

标签: c++c++11

解决方案


由于您的问题已在评论中得到解答,因此我发布了一种不同的方法来计算十进制数字(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:接受了弗兰克所要求的两倍的输入。

#include <iostream>

using namespace std;

int main()
{
    
    double num;
    
    string d;
    cin>>num;
    
    d = to_string(num);
    
    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;
}

推荐阅读