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
:接受了弗兰克所要求的两倍的输入。
#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;
}
推荐阅读
- c++ - 在一行中连接多个字符串c ++
- c++ - 给定一个未排序的数组,如何删除重复项然后对其进行排序?
- python-3.x - 如何在二分搜索中选择子区间的索引?
- spring-cloud-dataflow - Spring Cloud Data Flow - 有没有办法将参数存储为任务的一部分?
- python - Python 3.8 IDLE 拒绝保存,CTRL+S 产生换行符
- python - 通过使用 python 将 json 数据拆分为块来检索特定数据
- python - 我已经使用 anaconda python3 将 pdf 文件转换为 csv 但是转换后的 csv 文件不是可读形式如何使其可读?
- javascript - RollupJS 库 React Hook 错误 useState
- c - 操作指向 2D int Array 的指针数组
- java - 这种方法有什么问题...?