首页 > 解决方案 > Modulo % 仅在 C 中打印一个零位

问题描述

我一直在尝试在我的学校项目的代码中使用模数,但我遇到了一个“问题”:

在我的程序中,我想恢复我的结果并将它们转换为(打印在标准输出上)百分比。

例如:我找到我的数字(4 / 48),得到“0.08333333333”,乘以100得到“8.333333333”,我将第一个数字打印为int(所以它基本上会输出8),然后之后我想打印前两位数字,所以我将使用模 10 来获得“33”。

但是,我的“问题”是当我尝试打印两个零数字时,它只会显示其中一个,因为结果为零,所以不需要多个零。

我想出了如何像这样打印两个零位:

    if (((int)(freq * 100) % 100) == 0) {
        my_put_nbr((int)(freq * 100) % 10);
        my_put_nbr((int)(freq * 100) % 10);
    } else
        my_put_nbr((int)(freq * 100) % 100);

例如,在这种情况下,“freq”是“8.333334”,将导致打印 8 然后 33。

但我想知道是否有另一种实际正确的方法来做我刚刚在那里做的事情。

我不太擅长解释事情,但我希望这很清楚,否则请告诉我。

标签: cprintingnumbersmodulozero

解决方案


如果你有一个类似的值0.08333333并且你想将它显示为8.33,就做

 printf( "%.2f\n", freq * 100.0 );

如果您不被允许使用printf,那么请您的教练让这变得比需要的更难,这取决于您的my_put_nbr功能应该如何工作以及您希望如何格式化输出。如果函数打印出整数值并且您的freq值始终介于0and1并且您只想显示0.0833833,那么您需要做的就是

my_put_nbr( (int) freq * 10000 );

这将捕获小数点后的前两位数字,包括零 - 也就是说,0.0100将转换为100.

如果您my_put_nbr只应该打印单个数字,那么这需要更多的工作。你可以使用这样的循环:

for ( long mag = 1; mag < 100000; mag *= 10 )
{
  if (freq * mag < 1) // prevents leading 0s from
    continue;         // being displayed

  int digit = (long) (freq * mag) % 10;
  my_put_nbr( digit );
}

我正在long用于我的临时计算,因为int不能保证足够宽以存储 32 位值(它很可能在 1990 年之后构建的任何系统上都足够宽,但不能保证)。

如果这仍然不能完全满足您的需求,那么它至少应该给您一些想法。


推荐阅读