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
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityYou can use printf
for rounding:
$ printf "%.0f" 2743410360.320
bash
4.1 the builtin printf
says “invalid number”. Works fine with /usr/bin/printf
.
Nov 15, 2013 at 11:39
bash
4.2. Or maybe the problem was not the version – the first try was on Cygwin.
Nov 17, 2013 at 12:36
%i
or %.0f
? The former says 'invalid number' for me, the latter works.
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.
$ p=2743410360.320
$ echo $p
2743410360.320
$ echo ${p%%.*}
2743410360
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
$
sign looks quite interesting.)