标签: bankers-rounding

348
推荐指数
10
解决办法
55万
查看次数

舍入标准 - 财务计算

我很好奇在财务数据的计算方面存在任何"舍入"标准.我最初的想法是仅在数据呈现给用户(表示层)时执行舍入.

如果"舍入"数据然后用于进一步计算,应该使用"圆形"数字还是"原始"数字?有人有建议吗?

请注意,我知道不同的舍入方法,即银行家舍入等.

rounding-error bankers-rounding rounding financial

29
推荐指数
3
解决办法
3万
查看次数

C#银行家的舍入错误

double a = 18.565
return Math.Round(a,2)
Run Code Online (Sandbox Code Playgroud)

..返回18.57.
对于其他所有数字,我尝试过银行家的舍入按预期工作,例如Math.Round(2.565,2)返回2.56.

任何线索为什么以及何时发生?这是错误还是我错过了关于银行家四舍五入的事情?

谢谢..

c# bankers-rounding rounding

8
推荐指数
2
解决办法
4143
查看次数

有没有办法在.NET中进行'正确'的算术舍入?/ C#

我试图将一个数字舍入到它的第一个小数位,考虑到不同的MidpointRounding选项,这似乎运作良好.但是,当该数字具有随后的小数位数时会出现问题,这些小数位数会在算术上影响舍入.

一个例子:

随着0.1,0.11..0.190.141..0.44它的工作原理:

Math.Round(0.1, 1) == 0.1
Math.Round(0.11, 1) == 0.1
Math.Round(0.14, 1) == 0.1
Math.Round(0.15, 1) == 0.2
Math.Round(0.141, 1) == 0.1
Run Code Online (Sandbox Code Playgroud)

但随着0.141..0.149它总是回归0.1,虽然0.146..0.149应该回合0.2:

Math.Round(0.145, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.AwayFromZero) == 0.1
Math.Round(0.146, 1, MidpointRounding.ToEven) == 0.1
Math.Round(0.146M, 1, MidpointRounding.ToEven) == 0.1M
Math.Round(0.146M, 1, MidpointRounding.AwayFromZero) == 0.1M
Run Code Online (Sandbox Code Playgroud)

我试图提出一个解决这个问题的函数,并且它适用于这种情况,但当然如果你尝试舍入即0.144449它的第一个十进制数字(应该是0.2,但结果0.1)它会很好地失败.(那不是也不能使用Math.Round().)

private double "round"(double value, int digit)
{
    // basically the …
Run Code Online (Sandbox Code Playgroud)

.net c# math bankers-rounding rounding

6
推荐指数
4
解决办法
2705
查看次数

符合IEEE-754标准的半圆到偶数

C标准库提供的round,lroundllround家庭的C99功能.但是,这些功能不符合IEEE-754标准,因为它们没有实现IEEE规定的半个到偶数的"银行家舍入".如果小数分量恰好为0.5,则半到均匀舍入要求将结果四舍五入到最接近的偶数值.相反,如cppreference.com上所述,C99标准要求半个零距离

1-3)计算最接近arg的整数值(浮点格式),将中间情况舍入为零,不管当前的舍入模式如何.

在C中实现舍入的通常的临时方法是(int)(x + 0.5f)尽管在严格的IEEE-754数学中不正确,但通常由编译器将其转换为正确的cvtss2si指令.然而,这肯定不是一个可移植的假设.

如何实现一个函数,它将使用半对偶语义对任何浮点值进行舍入?如果可能,该函数应仅依赖于语言和标准库语义,以便它可以在非IEEE浮点类型上运行.如果这不可能,则根据IEEE-754位表示定义的答案也是可接受的.请用<limits.h>或表示任何常数<limits>.

c c++ floating-point bankers-rounding ieee-754

6
推荐指数
3
解决办法
2132
查看次数

.NET 货币格式化程序:我可以指定使用银行家的舍入吗?

有谁知道我如何获得格式字符串以使用银行家舍入?我一直在使用“{0:c}”,但这与银行家的舍入方式不同。该Math.Round()方法对银行家进行四舍五入。我只需要能够使用格式字符串复制它的舍入方式。


注意:原始问题相当具有误导性,提到正则表达式的答案源自于此。

.net c# formatting bankers-rounding

5
推荐指数
1
解决办法
2353
查看次数

Powershell:将分数转换为整数 - 令人惊讶的舍入行为

关于带小数的整数,我有一个有趣的问题.

假设我执行以下操作:

[int] $a = 5/2
$a
Run Code Online (Sandbox Code Playgroud)

我已经尝试了10次以确保,并且powershell总是返回 2

有没有办法强制Powershell在这种情况下向上或向下舍入,默认情况下它已设置为向下舍入?

我假设依赖于机器和Powershell环境,我可能在某些点得到3而在其他点得到2.

powershell integer bankers-rounding rounding

5
推荐指数
2
解决办法
1217
查看次数

实现整数除法的银行舍入

在 C 语言中,最简单的实现公式是什么int divround(int a, int b) {...},其中输出为 a/b,并采用银行家四舍五入(四舍五入为偶数)?

例如,divround(3,2)两者divround(5,2)的计算结果均为 2。

我正在编写嵌入式代码,所以我不能依赖库。我希望代码对于 ARM 和 RISC-V 是通用的,所以也不需要汇编。我试图模仿np.around(a/b)NumPy 中的行为(它执行大约一半到偶数),因此我可以准确比较来自 Python 和我的嵌入式应用程序的输出测试向量。

c embedded bankers-rounding rounding integer-division

5
推荐指数
1
解决办法
333
查看次数

使用Math.Round舍入问题

Module Module1
Public Sub Main()
    Dim values() As Double = {43.523, 12.65, 43.565}
    For Each value As Double In values
        Console.WriteLine("{0} --> {1}", value, Math.Round(value, 2))
    Next
    Console.ReadLine()
End Sub
End Module
Run Code Online (Sandbox Code Playgroud)

上面的代码结果为

  • 43.523 - > 43.52

  • 12.65 - > 12.65

  • 43.565 - > 43.56

我需要43.565 - > 43.57而不是43.565 - > 43.56.但我仍然需要其他43.523 - > 43.52和12.65 - > 12.65四舍五入.

c# vb.net math bankers-rounding rounding

3
推荐指数
1
解决办法
1998
查看次数

ARM NEON 将 f32 转换为 s32

是否有任何函数可以控制 vcvt_s32_f32 内在的舍入模式?我想使用舍入到偶数而不是舍入到负无穷大。

谢谢。

arm bankers-rounding neon

3
推荐指数
1
解决办法
1345
查看次数

Math.Round(1.225,2)给出1.23,不应该给1.22

AFAIK .NET的默认圆形选项是偶数,所以Math.Round(1.225,2)应该给1.22,但它给出1.23.

Math.Round(2.225,2) = 2.22 
Math.Round(100.225,2) = 100.22 
Run Code Online (Sandbox Code Playgroud)

我试过的所有值都是最接近的,但只有1.225-1.225回合到1.23-1.23.

.net c# bankers-rounding rounding

3
推荐指数
1
解决办法
253
查看次数

Oracle 中的银行家四舍五入

Oracle中是否有任何内部函数支持银行家舍入,我需要在选择查询中使用半到奇数银行家舍入

sql oracle bankers-rounding

1
推荐指数
1
解决办法
1300
查看次数