• [20190929]bash使用bc计算的相关问题.txt


    [20190929]bash使用bc计算的相关问题.txt

    --//快放假没什么事情,使用bash写一些小程序,转化number到oracle number编码,使用bc计算功能,发现一些小问题
    --//做一些记录:

    1.bc显示小数点前的0:

    $ echo "scale=3; 1/3" | bc
    .333

    --//很明显如果结果是0.xxxxx,bc的计算结果前面的0不显示。
    --//可以在网上找到一些方法:
    res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)

    --//另外bc是高精度的计算器,可能小数点位数很多,上面的printf不行。
    --//可以采用连接的方式,仅仅先判断第一个字符是否是"."就ok了(当然时正数的情况下)。

    2.四舍五入问题:
    # echo "scale=3; 2/3" | bc
    .666

    --//运算不做四舍五入。

    3.scale设置无效的问题:

    # echo  "scale=0 ; (0.01+193)" | bc
    193.01

    --//我想取整,结果输出193.01.导致设置scale=0无效,似乎+,-,*运算都不起作用,仅仅/可以控制这种行为。
    # echo  "scale=0 ; (0.01+193)*1" | bc
    193.01

    # echo  "scale=0 ; (0.01+193)/1" | bc
    193

    4.输出折行问题。
    # echo 2^250 | bc
    18092513943330655534932966407607485602073435104006338131165247501236
    42650624

    --//如果计算超过68个字符,会出现折行情况,当然这是正常的,加入tr过滤ok。
    # echo 2^250 | bc | tr -d ' \ '

    --//另外我在window下使用cygwin ,输出里面有" "字符.通过例子说明:
    $ cat aa.sh
    #! /bin/bash
    set -x
    a=$(echo 5+4 | bc )
    echo "$a"
    echo $a
    set +x

    $ ./aa.sh
    ++ echo 5+4
    ++ bc
    + a=$'9 '
    + echo $'9 '
    9
    + echo $'9 '
    9
    + set +x

    --//你可以发现在windows下bc的输出多了1个 字符.必须过滤掉.估计linux下没有这个问题.
    --//另外注意一个小问题,就是要保存文件格式为unix的文件格式.

    5.计算精度问题:
    # echo "l(.99999999999999999999)/l(100)" | bc -l
    0

    --//bc -l 缺省的scale=12,必须改变scale设置。
    # echo "scale=66;l(.99999999999999999999)/l(100)" | bc -l
    -.000000000000000000002171472409516259138266501956630606707163335634

    --//有一些情况即使设置很高精度反而出现问题,例子:
    > bc -l
    scale=180
    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(100)
    -65.0000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    000000000000000000000248123508996454719162468354

    --//这个正常输出-65.

    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
    -130.000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    0000000000000000000000496247017992909438324936737

    scale=20
    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
    -130.00000000000000000044
    scale=10
    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
    -130.0000000052
    scale=4
    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
    -130.0047

    --//当你限制scale过小时,反而误差更大。

    scale=400
    l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
    -130.000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000000000000000000000000000000000
    00000000000000000000000000000000000000171086395582297672322451960

    6.bc不支持科学计数法(科学计数法):
    # echo "1e2" | bc
    (standard_in) 1: parse error

    7.另外我发现bash编程能不用bc尽量不用,能不加载math库,尽量不要加载。
    --//最后我发现我写出来的转化程序number到oracle number编码运行不是很快,我是在windows下使用cygwin调试的。基本上转化1个大
    --//约接近2秒,我只能考虑别的方式尽可能减少bc使用。

  • 相关阅读:
    各种数据库默认端口总结
    Entity Framework学习
    Entity Framework学习
    .Net MVC API初试
    MongoDB Shell
    MongoDB安装及简单实验
    Android Studio记录
    Android使用Fragment程序崩溃
    git操作笔记
    centos防火墙设置
  • 原文地址:https://www.cnblogs.com/lfree/p/11623099.html
Copyright © 2020-2023  润新知