gpt4 book ai didi

perl - 为什么 Perl 与 sprintf 舍入不一致?

转载 作者:行者123 更新时间:2023-12-04 01:34:37 25 4
gpt4 key购买 nike

这是一个 Perl 脚本:

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

my @numbers = qw(
0.254
0.255
0.256
);

foreach my $number (@numbers) {
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}

foreach my $number (@numbers) {
$number += 100;
my $rounded = sprintf '%.2f', $number;
say "$number => $rounded";
}

它输出:
0.254 => 0.25
0.255 => 0.26
0.256 => 0.26
100.254 => 100.25
100.255 => 100.25
100.256 => 100.26

对我来说,Perl 与舍入不一致是很奇怪的。我希望以 .255 结尾的两个数字都四舍五入为 .26 0.255 是正确的,但数字 100.255 是错误的。

这是 Perl Cookbook 中的引述, http://docstore.mik.ua/orelly/perl/cookbook/ch02_04.htm ,

sprintf . The f format lets you specify a particular number of decimal places to round its argument to. Perl looks at the following digit, rounds up if it is 5 or greater, and rounds down otherwise.



但我在 http://perldoc.perl.org/functions/sprintf.html 中看不到任何证据表明它是正确的

是 sprintf 中的错误还是 Perl Cookbook 错误?如果这是理想的行为,为什么它会这样工作?

最佳答案

Perl 使用底层 C 库进行格式化。这个库所做的可能因平台而异。甚至 POSIX 也说“低位数字应以实现定义的方式四舍五入。”

在 glibc 中,可以说大多数 perl 二进制文件都使用它,您看到的行为将受到以下几件事的影响:

首先,正如在另一个答案中所指出的,您认为四舍五入的值可能无法以浮点数完全表示,四舍五入的方式将取决于它是下一个更高或更低的可表示数字。

其次,即使该值可以精确地表示为两个可能的舍入之间的中间值,glibc 也将使用银行家的舍入。也就是说,它将四舍五入为偶数。所以sprintf '%.1g', .25将产生 .2 ,但是 sprintf '%.1g', .75将产生 .8 .

Perl Cookbook 中的引用完全是错误的。

关于perl - 为什么 Perl 与 sprintf 舍入不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41312890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com