我很好奇在财务数据的计算方面存在任何"舍入"标准.我最初的想法是仅在数据呈现给用户(表示层)时执行舍入.
如果"舍入"数据然后用于进一步计算,应该使用"圆形"数字还是"原始"数字?有人有建议吗?
请注意,我知道不同的舍入方法,即银行家舍入等.
double a = 18.565
return Math.Round(a,2)
Run Code Online (Sandbox Code Playgroud)
..返回18.57.
对于其他所有数字,我尝试过银行家的舍入按预期工作,例如Math.Round(2.565,2)返回2.56.
任何线索为什么以及何时发生?这是错误还是我错过了关于银行家四舍五入的事情?
谢谢..
我试图将一个数字舍入到它的第一个小数位,考虑到不同的MidpointRounding选项,这似乎运作良好.但是,当该数字具有随后的小数位数时会出现问题,这些小数位数会在算术上影响舍入.
一个例子:
随着0.1,0.11..0.19和0.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) C标准库提供的round,lround和llround家庭的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>.
有谁知道我如何获得格式字符串以使用银行家舍入?我一直在使用“{0:c}”,但这与银行家的舍入方式不同。该Math.Round()方法对银行家进行四舍五入。我只需要能够使用格式字符串复制它的舍入方式。
注意:原始问题相当具有误导性,提到正则表达式的答案源自于此。
关于带小数的整数,我有一个有趣的问题.
假设我执行以下操作:
[int] $a = 5/2
$a
Run Code Online (Sandbox Code Playgroud)
我已经尝试了10次以确保,并且powershell总是返回 2
有没有办法强制Powershell在这种情况下向上或向下舍入,默认情况下它已设置为向下舍入?
我假设依赖于机器和Powershell环境,我可能在某些点得到3而在其他点得到2.
在 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 和我的嵌入式应用程序的输出测试向量。
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四舍五入.
是否有任何函数可以控制 vcvt_s32_f32 内在的舍入模式?我想使用舍入到偶数而不是舍入到负无穷大。
谢谢。
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.
Oracle中是否有任何内部函数支持银行家舍入,我需要在选择查询中使用半到奇数银行家舍入