2

awk を使用して、bash でいくつかの 10 進数値を四捨五入しようとしています。例: 値が 6.79 の場合

awk 'BEGIN {rounded = sprintf("%.0f", 6.79); print rounded }'

これは私に7を返します。

最も近い整数 (1,2,3,..) ではなく、0.5 刻み (0,0.5,1,1.5,2,2.5...) で四捨五入できる方法はありますか?

python または perl で動作する別の方法も問題ありません。Pythonの現在の方法

python -c "from math import ceil; print round(6.79)"

7.0も返す

4

2 に答える 2

0

これは、指定された精度で最も近い値に丸めるための普遍的なサブプログラムです。たとえば、0.5 など、必要な丸めの例を示します。テストしたところ、負の浮動小数点数でも完全に機能します。

#!/usr/bin/env perl
use strict;
use warnings;

for(my $i=0; $i<100; $i++){
    my $x = rand 100;
    $x -= 50;
    my $y =&roundToNearest($x,0.5);
    print "$x --> $y\n";
} 
exit;

############################################################################
# Enables to round any real number to the nearest with a given precision even for negative numbers
#  argument 1 : the float to round
# [argument 2 : the precision wanted]
#
# ie: precision=10 => 273 returns 270
# ie: no argument for precision means precision=1 (return signed integer) =>  -3.67 returns -4
# ie: precision=0.01 => 3.147278 returns 3.15

sub roundToNearest{

  my $subname = (caller(0))[3];
  my $float = $_[0];
  my $precision=1;
  ($_[1]) && ($precision=$_[1]);
  ($float) || return($float);  # no rounding needed for 0

  # ------------------------------------------------------------------------
  my $rounded = int($float/$precision + 0.5*$float/abs($float))*$precision;
  # ------------------------------------------------------------------------

  #print  "$subname>precision:$precision float:$float --> $rounded\n";

  return($rounded);
}
于 2014-03-13T15:47:12.773 に答える