Ran*_*ard 168 floating-point perl rounding
如何将十进制数(浮点)舍入到最接近的整数?
例如
1.2 = 1
1.7 = 2
Run Code Online (Sandbox Code Playgroud)
Vin*_*vic 192
Perl有round()函数吗?那么ceil()和floor()怎么样?Trig功能?请记住,
int()只是截断朝向0.对于舍入到一定数量的数字,sprintf()或printf()通常是最简单的路线.
Run Code Online (Sandbox Code Playgroud)printf("%.3f", 3.1415926535); # prints 3.142所述
POSIX模块(标准的Perl分布的一部分)实现ceil(),floor()以及一些其他的数学和三角函数.
Run Code Online (Sandbox Code Playgroud)use POSIX; $ceil = ceil(3.5); # 4 $floor = floor(3.5); # 3在5.000至5.003 perls中,在
Math::Complex模块中进行三角测量.对于5.004,Math::Trig模块(标准Perl发行版的一部分)实现了三角函数.在内部,它使用Math::Complex模块,一些函数可以从实轴突破到复平面,例如2的反正弦.财务应用程序中的舍入可能会产生严重影响,应精确指定所使用的舍入方法.在这些情况下,可能不会相信Perl正在使用的系统舍入,而是实现您自己需要的舍入功能.
要了解原因,请注意您在中途点轮换中仍然存在问题:
Run Code Online (Sandbox Code Playgroud)for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i} 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0不要怪Perl.它与C中的相同.IEEE表示我们必须这样做.绝对值为
2**31(在32位机器上)的整数的Perl数字将与数学整数非常相似.其他数字不保证.
RET*_*RET 128
对于更常见(也可能是微不足道)的用例,虽然没有不同意关于中途标记的复杂答案等等:
my $rounded = int($float + 0.5);
UPDATE
如果您可能$float是否定的,则以下变体将产生正确的结果:
my $rounded = int($float + $float/abs($float*2 || 1));
通过此计算,-1.4舍入为-1,-1.6为-2,零不会爆炸.
Evd*_*vdB 71
你可以使用像Math :: Round这样的模块:
use Math::Round;
my $rounded = round( $float );
Run Code Online (Sandbox Code Playgroud)
或者你可以粗暴地做到这一点:
my $rounded = sprintf "%.0f", $float;
Run Code Online (Sandbox Code Playgroud)
小智 45
如果您决定使用printf或sprintf,请注意它们使用Round half to even方法.
foreach my $i ( 0.5, 1.5, 2.5, 3.5 ) {
printf "$i -> %.0f\n", $i;
}
__END__
0.5 -> 0
1.5 -> 2
2.5 -> 2
3.5 -> 4
Run Code Online (Sandbox Code Playgroud)
请记住,
int()只是截断为0.对于舍入到一定数量的数字,sprintf()或printf()通常是最简单的路线.Run Code Online (Sandbox Code Playgroud)printf("%.3f",3.1415926535); # prints 3.142所述
POSIX模块(标准的Perl分布的一部分)实现ceil(),floor()以及一些其他的数学和三角函数.Run Code Online (Sandbox Code Playgroud)use POSIX; $ceil = ceil(3.5); # 4 $floor = floor(3.5); # 3在5.000至5.003 perls中,在
Math::Complex模块中进行三角测量.使用5.004,
Math::Trig模块(标准Perl分发的一部分)>实现三角函数.在内部,它使用
Math::Complex模块,一些函数可以从实轴突破到复平面,例如2的反正弦.财务应用程序中的舍入可能会产生严重影响,应精确指定所使用的舍入方法.在这些情况下,可能不会相信Perl正在使用的系统舍入,而是实现您自己需要的舍入功能.
要了解原因,请注意您在中途点轮换中仍然存在问题:
Run Code Online (Sandbox Code Playgroud)for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i } 0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 0.8 0.8 0.9 0.9 1.0 1.0不要怪Perl.它与C中的相同.IEEE表示我们必须这样做.绝对值为2**31(在32位机器上)的整数的Perl数将与数学整数非常相似.其他数字不保证.
| 归档时间: |
|
| 查看次数: |
325101 次 |
| 最近记录: |