9

I will get value like 2743410360.320 and I want value like 2743410360 to a variable.

I tried

INTValueOfGB=$ echo "($gb+0.5)/1" | bc

But I am getting (standard_in) 1: syntax error

RobertL
  • 6,690
  • 1
  • 19
  • 38
vin
  • 91
  • 1
  • 1
  • 2
  • Please check that your code's syntax is still the one you intended to post after I edited it. (That solitary `$` sign looks quite interesting.) – manatwork Nov 15 '13 at 11:23

4 Answers4

10

You can use printf for rounding:

$ printf "%.0f" 2743410360.320
dchirikov
  • 3,818
  • 2
  • 15
  • 18
7

I don't see an answer to @vin's problem, which is:

But I am getting (standard_in) 1: syntax error

The bc command prints (standard_in) 1: syntax error because the shell variable gb is not set:

$ unset gb
$ echo "($gb+0.5)/1" | bc
(standard_in) 1: syntax error

$ gb=2743410360.320
$ echo "($gb+0.5)/1" | bc
2743410360

In the comments to the @dchirikov's answer, @vin says printf "%.0f" is "not working":

$ unset gb
$ printf '%.0f\n' $gb
0

$ gb=2743410360.320
$ printf '%.0f\n' $gb
2743410360

In both of the areas where @vin has problems, the unset variable reproduces the problem, and setting the variable solves the problem.

RobertL
  • 6,690
  • 1
  • 19
  • 38
4
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
michas
  • 21,190
  • 4
  • 63
  • 93
3

Your command needs a couple of ( ):

INTValueOfGB=$( echo "($gb+0.5)/1" | bc )

But that will not round the number, for that to work you need to set scale to 0:

INTValueOfGB=$( echo "scale=0;($gb+0.5)/1" | bc )

That will round up (from x.5) to the next integer.

To get "round to next even integer" (Banker's rule), you need to use printf rounding:

LC_NUMERIC=C printf "%.0f" 2743410360.320

The LC_NUMERIC is to ensure that numbers are processed with a dot as decimal. That is not what users in Germany will like to use, this should work with decimals with ,:

$ LC_NUMERIC=de_DE.utf8 printf "%.0f" 2743410360,320
2743410360