使用printf进行怪异的浮点舍入行为

Hai Zhang

我已经在该网站上阅读了一些答案,并认为该printf取整是可取的。

但是,当我在实践中使用它时,一个细微的错误导致我出现以下行为:

$ echo 197.5 | xargs printf '%.0f'
198
$ echo 196.5 | xargs printf '%.0f'
196
$ echo 195.5 | xargs printf '%.0f'
196

请注意,舍入196.5变为196

我知道这可能是一些微妙的浮点错误(但这不是一个很大的数目,对吧?),所以有人可以对此加以说明吗?

也非常欢迎此问题的一种解决方法(因为我现在尝试将其用于工作)。

用户名

正如预期的那样,它是“四舍五入”或“银行家的四舍五入”。

一个相关网站的答案解释。

该规则试图解决的问题是(对于具有一位小数的数字),

  • x.1到x.4四舍五入。
  • x.6到x.9均被四舍五入。

那是4下降4上升。
为了保持四舍五入的平衡,我们需要对x.5进行四舍五入

  • 一次,一次。

这是通过以下规则完成的:«舍入到最接近的“偶数”»。

在代码中:

LC_NUMERIC=C printf '%.0f ' "$value"
echo "$value" | awk 'printf( "%s", $1)'


选项:

总的来说,有四种可能的方法可以对数字进行四舍五入:

  1. 已经解释过的银行家规则。
  2. 向+无限舍入。向上舍入(为正数)
  3. 向-无限方向舍入。四舍五入(正数)
  4. 向零舍入。删除小数点(正数或负数)。

向上

如果您确实需要“向上舍入(朝+infinite)”,则可以使用awk:

value=195.5

echo "$value" | awk '{ printf("%d", $1 + 0.5) }'
echo "scale=0; ($value+0.5)/1" | bc

如果您确实需要“向下舍入(Toward -infinite)”,则可以使用:

value=195.5

echo "$value" | awk '{ printf("%d", $1 - 0.5) }'
echo "scale=0; ($value-0.5)/1" | bc

修剪小数。

删除小数点(点后的所有内容)。
我们还可以直接使用外壳程序(适用于大多数外壳程序-是POSIX):

value="127.54"    ### Works also for negative numbers.

echo "${value%%.*}"
echo "$value"| awk '{printf ("%d",$0)}'
echo "scale=0; ($value)/1" | bc

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用printf进行怪异的浮点舍入行为

来自分类Dev

C#浮点舍入行为

来自分类Dev

C ++舍入行为

来自分类Dev

C ++舍入行为

来自分类Dev

科学记数舍入行为

来自分类Dev

ASM printf怪异的行为

来自分类Dev

ASM printf怪异的行为

来自分类Dev

与printf()怪异的行为

来自分类Dev

printf%.3f和bc舍入行为之间的区别

来自分类Dev

Python关于舍入的怪异行为

来自分类Dev

使用sed的行为很怪异

来自分类Dev

Python:如何管理float和int之间的舍入行为?

来自分类Dev

使用声明的怪异行为

来自分类Dev

MySQL怪异的浮点数和十进制行为

来自分类Dev

MySQL怪异的浮点数和十进制行为

来自分类Dev

使用sprintf舍入浮点数

来自分类Dev

使用AWK舍入浮点数

来自分类Dev

使用f字符串舍入浮点

来自分类Dev

使用样式属性设置输入行为

来自分类Dev

PHPExcel更改服务器上的舍入行为-寻求调试建议

来自分类Dev

int16_t进行浮点转换怪异

来自分类Dev

在JavaScript中使用+ +时的怪异行为

来自分类Dev

Internet Explorer使用PHP的怪异行为

来自分类Dev

使用断点的Monotouch怪异行为

来自分类Dev

使用双指针时的怪异行为

来自分类Dev

使用ArrayNodeDefinition :: addDefaultChildrenIfNoneSet()的怪异行为

来自分类Dev

使用“ git difftool”的怪异终端行为

来自分类Dev

使用HashMap时的怪异行为

来自分类Dev

是否可以使用BASH / bc / printf将浮点数舍入到第一个有效数字?