我以纳秒精度获取日期:
$ start=$(date '+%s.%N')
Run Code Online (Sandbox Code Playgroud)
...然后打印它:
$ echo ${start}
1662664850.030126174
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好。但是看看当我以任意大的精度 printf 时得到的结果:
1662664850.0301261739805340766906738281250000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
Q1. date 命令实际上是否用那么多信息填充了 start 变量,或者这些数字只是垃圾?
这是问题的第二部分。假设我想做一些时间数学。创建一个“结束”时间戳:
$ end=$(date '+%s.%N')
$ echo ${end}
1662665413.471669572
$ printf "%.55f\n" ${end}
1662665413.4716695720562711358070373535156250000000000000000000000
Run Code Online (Sandbox Code Playgroud)
现在我使用 bc 得到了我期望的结果:
$ echo $(bc <<< ${end}-${start})
563.441543398
Run Code Online (Sandbox Code Playgroud)
但看看我使用 python 或 perl 时得到的结果:
$ echo $(python -c "print(${end} - ${start})")
563.441543579
$ echo $(perl -e "print(${end} - ${start})")
563.441543579102
Run Code Online (Sandbox Code Playgroud)
在某个时刻,这个数字会脱离轨道:
BC 563.441543 398 python 563.441543 579 perl 563.441543 579 102
Q2。这些数字有所不同,但由于四舍五入而导致的结果与您预期的不同。是什么赋予了?
系统信息:
Linux 3.10.0-1160.71.1.el7.x86_64 #1 SMP 2022 年 …