【问题标题】:Printing a very large whole number in C在 C 中打印一个非常大的整数
【发布时间】:2012-04-26 16:12:27
【问题描述】:

我在浮点变量中存储了一个非常大的数字,但是当我打印它时,我只想显示整数部分,小数点后什么也不显示。

对于 int 或 long 范围内的数字,我会进行强制转换,但这对我没有帮助,因为我要打印的数字对于 int 或 long 来说太长了。

我看过这个解释:http://www.cprogramming.com/tutorial/printf-format-strings.html 但我还没有成功解决这个问题。

这是我的代码,也是我尝试进行的转换:

double sum=552074001368;
long long_sum;
long_sum = (long)(sum);      //int casting for double "add" 
if(sum>=0) printf("=\n%ld\n",long_sum);
else printf("=\n%ld\n",-long_sum);

我不想使用像 printf("%15f") 这样的特定精度,因为这个变量会波动,有时非常短,比如 4 位数。

【问题讨论】:

  • 上面的代码有什么问题?它打印 552074001368。这不是你想要的吗?
  • @MikeKwan 它只会在具有 64 位 long 的系统上执行此操作。
  • 强制转换的根本问题是,它只有在目标类型(在本例中为长整数)包含数字时才有效——在这种情况下,您不妨使用该目标类型开始。
  • @Mike 我有一个 64 位系统,但它仍然打印 -2147483648
  • @nofe:一些 64 位系统仍然有 32 位长度。你可以试试long long

标签: c


【解决方案1】:

使用精度修饰符.0并打印数字的floor

printf("%.0f\n", floor(sum));

(或absfloor,如果您只需要幅度,如示例代码中所示。)

【讨论】:

  • 这可能是正确的答案,但我不允许使用我们在课堂上没有教过的函数,而且我在任何地方都没有看到 floor()。
  • 您不需要带有该符号的floor。请参阅我之前的回答。
  • @nofe:也许只是尝试不使用floor 然后——我认为精度修饰符可能足以完成这项工作。如果小数大于.5,唯一的危险可能是四舍五入。
【解决方案2】:

我想你要的是%.0f。例如:

#include <stdio.h>

int main(){

    double x = 1234.567;

    printf("%.0f", x);
    return 0;
}

...打印:

1235

【讨论】:

  • 你的 libc 必须被破坏。在我的系统上,打印1235
  • @larsmans:是的——正如你评论的那样正在编辑。如果他需要截断而不是四舍五入,你的答案是正确的:他也应该使用floor
  • @MrLister:当你的回答是%g 时,大多数反对者都给出了反对意见,而且大多数反对者可能还没有再看它,因为你已经将其更改为使用@987654327 @.
  • @MrLister:有时会发生——无论好坏,系统倾向于奖励第一个(或前几个)合理的答案。我已经写了相当多的长而仔细的答案,但很少或没有代表,而(IMO)相对平庸的较早发布的答案却得到了很多。这就是生活......
【解决方案3】:

你为什么要投长?使用 printf 格式说明符来控制打印的字符和数量。 http://www.cplusplus.com/reference/clibrary/cstdio/printf/

请记住,宽度和精度都可以由变量指定,而不必在编译时知道:

printf("=\n%.*lf\n", 4, sum); // print 4 places behind the decimal point

 int i;
 i = 5;
// print only the whole number part of sum and output at least i characters,
//    pad with leading spaces if number requires fewer than i characters 
printf("=\n%*.*lf\n", i, 0, sum); 

【讨论】:

    【解决方案4】:

    这行有问题:

    double sum=552074001368;
    

    由于这是一个整数文字,编译器将首先检查该数字是否适合int,然后是long,然后是long long。如果它不适合long long,我怀疑你会得到编译器错误或未定义的行为环绕,我不确定是哪一个。

    如果您的编译器支持long long,则代码将起作用,并且该数字将存储在临时long long 中(将被优化掉)。然后将这个long long 存储在double 中。

    改为这样写:

    double sum=552074001368.0;
    

    .0 语法为您提供了一个双浮点字面量,根本不涉及整数类型。

    【讨论】:

      【解决方案5】:
      double sum=552074001368LL;
      long long long_sum;
      long_sum = (long long)(sum);
      if(sum>=0) printf("=\n%lld\n",long_sum);
      else printf("=\n%lld\n",-long_sum);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-02
        • 2011-02-09
        • 2010-09-12
        • 2015-08-18
        • 1970-01-01
        相关资源
        最近更新 更多