首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不四舍五入的浮点数转换为字符串

不四舍五入的浮点数转换为字符串
EN

Stack Overflow用户
提问于 2019-05-15 17:41:04
回答 3查看 800关注 0票数 3

我想从十进制数中提取小数位。没那么难,对吧?

所以,我把浮点数转换成了字符串。

然后,我使用substr()裁剪从string.find('.')+1开始的字符串,直到最后。

好吧..。问题就在这里。当我们有一个像这样的数字时:5.7741589,它不是那么“精确”,实际上是:5.774159

如果它自身舍入,我不能精确地得到小数位数...所以问题是:

如何将十进制数转换为字符串,而不对其进行四舍五入?

编辑:由于很多人都在询问实际的输入、输出和代码,因此如下所示:

代码语言:javascript
复制
Input: 5.7741589
Output (let's say we want to output just decimal places): 7741589
Output (not expected one): 774159

代码:

代码语言:javascript
复制
float num;
cin>>num;
string s = to_string(num);
s = s.substr(s.find('.')+1,s.length());
cout<<s<<endl;

EDIT2:还有一件事。我需要这个竞争编程,我可以做这个练习的输入作为字符串。假设你有两个十进制数的问题,你需要将它们相乘,然后计算小数位数。然后再次丢失小数位,这就是问题所在。

EN

回答 3

Stack Overflow用户

发布于 2019-05-15 17:44:50

当您使用二进制浮点数对十进制数进行建模时,rot就开始了:浮点方案对实数的子集进行建模。在这方面,这与使用整型没有什么不同:从概念上讲,出现的问题也没有什么不同。

如果你想精确地模拟十进制数,那么就使用decimal类型。

票数 4
EN

Stack Overflow用户

发布于 2019-05-15 19:05:25

您得到的结果是因为对小数位进行了四舍五入。这是因为只要您输入一个浮点数,无论小数位数是多少,它存储的小数位数与数据类型的精度一样多。因此,对于浮点型(可以存储8位小数),如果您输入

代码语言:javascript
复制
1.1234      ---- Stored as ---> 1.12339997
1.123       ---- Stored as ---> 1.12300003
5.7741589   ---- Stored as ---> 5.77415895

因此,基本上,您是将输入存储在小数位数(8)中。可以做的是,您可以使用下面的代码片段来强制,在小数位后使用所需的位数,并将其转换为字符串。

代码语言:javascript
复制
float num;
cin >> num;

char buf[20];

// 8 is as per the (precision required + 1). So in this case,
// we have 7 digits after decimal, so 8 is used.
sprintf(buf, "%.8f", num); 

// Truncating the rounding off
buf[strlen(buf) - 1] = '\0';

string s(buf);
s = s.substr(s.find('.') + 1, s.length());
cout << s << endl;  

虽然使用这种方法,但所有输入的小数位数都是相同的。

这是一种变通方法,因为您输入的值5.7741589没有按原样存储。因此,如果源本身不是您输入的源,那么假设源是您提供的源,您如何获得所需的输出。

票数 1
EN

Stack Overflow用户

发布于 2019-05-15 22:08:51

让我们看看会发生什么(这个答案假设IEEE-754,浮点数是32位的二进制浮点数)。

首先,输入十进制数: 5.7741589。这个数字必须存储到32位的二进制浮点数中。

此二进制数字为101.11000110001011110100011100010101011010000100011...

要将其存储到浮点数中,我们需要对其进行舍入(以二进制形式)。所以cin>>num就是lossy。它将四舍五入为最接近的32位二进制浮点数,即:

二进制形式的十进制: 1.01110001100010111101001 * 2^2 = 101.110001100010111101001.

  • in十进制: 1.44353973865509033203125 * 2^2 = 5.774158954620361328125.

正如你所看到的,在你的输入数字被转换成浮点数之后,讨论小数位是没有意义的,因为你的输入数字已经被修改了(查看你的二进制数字,它被舍入了。将数字视为小数,它有很多额外的数字,它的值与原始数字略有不同)。

如果你想解决这个问题,你需要以字符串的形式输入数字,或者你需要使用某种类型的十进制浮点库。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56146211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档