gpt4 book ai didi

c - 如何在 C 中将 float 转换为字符串而不丢失用户输入的精度?

转载 作者:行者123 更新时间:2023-11-30 14:55:45 25 4
gpt4 key购买 nike

这就是我正在尝试做的事情:

  • 我需要打印 float 的小数部分,该 float 必须在用户输入期间作为 float 输入。
  • 小数部分应类似于:如果 float 为 43.3423,则输出应为 3423;如果数字是 45.3400,输出应该是 3400
  • 这可以通过字符串输入轻松完成,但我需要一种方法来使其与 float 一起使用,而不会丢失额外的零或不在用户的原始输入中附加零。
<小时/>

这是我已经尝试过的:-

  • 将小数部分除以 frac = num - (int)num,然后乘以 frac,直到余数为零。但对于 34.3400 之类的情况,此方法会失败 - 最后两个零不会包含在此方法中。
  • 将 float 转换为字符串

    char string[20];
    sprintf(string, "%f", float_number);

sprintf 函数将 float 作为字符串,但这里它也不会自动检测用户输入的精度,并在字符串末尾填充额外的零(总精度为 6)。所以这里也没有获取到用户原来输入的精度信息。

那么,有没有办法完成这个任务呢?该数字必须是用户提供的 float 。有什么方法可以获取有关用户输入精度的信息吗?如果不可能,解释会非常有帮助。

最佳答案

我想我明白你来自哪里。例如。在物理学中,是否写 42.5 是有区别的。或42.500有效数字的数量是隐式给出的。 42.5代表任意数字 x: 42.45 <= x < 42.5542.500对于任何 x: 42.4995 <= x < 42.5005 .

对于更大的数字,您可以使用科学记数法:1.0e6表示数字 x 为 x: 950000 <= x < 1050000 .

float 使用相同的格式,但使用二进制数字(有时称为位;))而不是十进制数字。但有两个重要的区别:

  • 使用的位数(位)仅取决于 float 的数据类型。如果您的数据类型有例如尾数为20位,其中存储的每个数字都会有这20位。尾数总是在“小数”(二进制?)点之后不带任何部分存储,因此您不知道有多少有效位。
  • 位和十进制数字之间没有直接映射。您将需要大约 3.5 位来表示一个十进制数字。因此,即使您知道一些有效位,您仍然不知道会产生多少有效十进制数字
<小时/>

为了解决您的问题,您可以自己存储有效数字的数量,如下所示:

struct myNumber
{
double value;
int nsignificant;
};

当然,您必须自己解析输入以找出要放在 nsignificant 中的内容。 。另外,至少使用 double这里的值,float 的精度非常有限。不会让你走得太远。这样,您可以使用 nsignificant确定用于打印具有所需位数的数字的正确格式字符串。

这仍然存在上面提到的问题:您无法直接将十进制数字映射到位,因此永远不能保证您的数字可以按照您想要的精度存储。如果精确的十进制表示很重要,您将需要使用不同的数据类型。 C# provides one ,但 C 没有。你必须自己实现它。您可以从这样的事情开始:

struct myDecimal
{
long mantissa;
short exponent;
short nsignificant;
}

在此结构中,您可以例如地点 1.0e6像这样:

struct myDecimal x = {
.mantissa = 1;
.exponent = 6;
.nsignificant = 2;
};

当然,这需要您编写大量自己的代码来解析和格式化这些数字。

关于c - 如何在 C 中将 float 转换为字符串而不丢失用户输入的精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45560704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com