微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用C++计算小数部分的问题?

如何解决用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 举报,一经查实,本站将立刻删除。