【问题标题】:dynamically set decimal separator in number/string using c programming使用c编程动态设置数字/字符串中的小数点分隔符
【发布时间】:2021-05-31 11:58:28
【问题描述】:

我在输入字符串中放置小数点时遇到问题。请参考我的代码以便更好地理解。 说明:该字段的宽度应为八 (8) 位,右对齐,填充零。最左边的数字表示小数分隔符应从右移的位置数。

预期的结果应该是这样的: 示例 1:71234567 输出 0.1234567

示例 2:31234567 输出:1234.567

但是当我用上面的例子运行我的代码时,我得到了低于输出。 输出 1:0.123457 输出2:1234.567000

它不应该需要在右侧附加零。为什么会发生这种情况。谁能告诉我。

附上我的代码sn-p:

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>

int main()
{
        unsigned char str[8] = "31234567";
        int num = atoi(str);  //Convert string to int
        printf("num = %d\n",num);
        int FirstDigit = num;
        num = num % (unsigned long)pow(10.0, (double)floor(log10(num)));
        printf("After removing 1st digit from number = %d\n",num);
        while(FirstDigit>=10)
        {
            FirstDigit = FirstDigit/10;
        }
        printf("Decimal position stored in FirstDigit = %d\n",FirstDigit);
        printf("Final value = %f",num/pow(10,FirstDigit));
        return 0;
}

【问题讨论】:

  • 将输入视为以数字开头的字符串,例如"4abcdef"
  • 我需要了解我的代码有什么问题。如果有人能告诉我们修改后的代码,我将不胜感激。谢谢!
  • 您好,您正在获得默认的浮点格式...如果您想要特定数量的数字,您需要使用不同的格式字符串 - 例如 "%.2f" 在后面给出两个位置小数点.. 请参阅 (en.cppreference.com/w/c/io/fprintf) 或 (stackoverflow.com/a/67457936/15310387) 了解更多详情

标签: c


【解决方案1】:

如果未指定精度,则默认 printf 给出 6 个有效数字。

https://man7.org/linux/man-pages/man3/printf.3.html

g, G double 参数以 f 或 e(或 F 或 E 表示 G 转换)。精度指定数量 的有效数字。如果精度缺失,6 给出数字;如果精度为零,则对其进行处理 如 1. 如果从其转换得到的指数,则使用样式 e 小于 -4 或大于或等于精度。 从小数部分删除尾随零 结果;小数点仅在其后出现 至少一位数。

在您的情况下,您尝试打印数字 0.1234567,但该数字有 7 个有效数字。所以 printf 将该数字四舍五入为 0.123457。您可以像这样指定精度。

printf("Final value = %.7f",num/pow(10,FirstDigit)); // (%.7f)

但您也想去掉尾随的零。为此,您可以像这样使用它。

printf("Final value = %.10g",num/pow(10,FirstDigit)); // (%.10g)

我将精度指定为 10,因为您使用的是 int。因此 int 最多可以有 10 个数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    相关资源
    最近更新 更多