bc:设置小数点后的位数


52

bc 将数字处理为整数:

# echo "100/3" | bc
33

bc -l 将数字作为浮点对象处理:

# echo "100/3" | bc -l
33.33333333333333333333

有没有办法限制小数点后的位数?


10
有趣的是,这仅适用于除法。如果您想做,则scale=0;1234*1.1必须将其编写为scale=0;1234*1.1/1get 1357。否则,无论的价值如何scale,您都会得到1357.4
2014年

@Wok的评论不应该放在已接受的答案上,而不是在问题上吗?在阅读答案之前,我不知道此评论指的是什么。
威尔逊F

1
@WilsonF添加了对答案的引用。
亚当·马坦

2
@Wok,它不依赖于除法或乘法。这取决于输入-最大精度数字决定输出中的精度。注意如何1234*1.0给您1234.0
Richlv '16

Answers:


70

设置scale特殊变量:

$ echo "scale=2; 100/3" | bc
33.33

3
请参阅@Wok对这个问题的评论。
亚当·马坦

$ echo "scale=2; (100/180)*180" | bc给出99.00 :(
DonatasOlsevičius16

@DonatasOlsevičius这是因为(100/180)= 0.55,然后(0.55 * 180)=99。所以它给您正确的价值:)
Kamaldeep singh Bhatia

如果向上取整,那就很好.5~$ echo "scale=2; 12/104" | bc .11 如果四舍五入会是这样.12。但是,它仍然可以完成我的任务。
jbrock

3
您可以保持精度,直到以这种方式打印值为止:echo "result = (100/180) * 180; scale=2; result / 1" | bc -l。现在你知道了99.99
拜伦·霍金斯

10

scale仅适用于除法;如果某些极客需要乘法,则可以使用字符串操作来实现。说如果您需要乘法32 * 0.60,答案是19.20。如果您需要单独获得19,则可以通过其他方法获得它。

  1. 使用字符串操作

    $ S=$(echo "32*.60" | bc ) ; echo ${S%.*}
    19
    

    String Manipulation语法:${Variable%pattern},这将删除之后的短匹配模式%。有关更多字符串操作的详细信息,请参见《高级Bash脚本指南》

  2. 使用方式Scale如下**chronitis**

    $ echo "scale=0; 32*60/100" | bc
    19
    
  3. 要摆脱尾随的0,可以用1除以代替字符串处理。

    $ echo "0.232 * 1000" | bc
    232.000
    
    $ echo "0.232 * 1000 / 1" | bc
    232
    

请注意,正如我在对该问题的评论中提到的那样,它不是由乘法引起的,而是由具有小数部分的输入数字引起的。或者换句话说,带有“最长”小数部分的数字将确定输出将具有多少个小数位。
Richlv

4

除了以前的答案

echo "scale=2; 1.0150876" | bc

退货

1.0150876

添加数学运算仅获得2个十进制数字-(NUMBER * 100)/ 100

echo "scale=2; (1.0150876 * 100) / 100" | bc

现在返回

1.01


2

四舍五入

scale = 2将答案截断为两位小数,但是我们可以像这样实现四舍五入:

$ echo "a=12/104; scale=2; (a+0.005)/1" | bc -l
.12
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.