.NET中使用哪种货币舍入算法?

拖船船长

是否有最佳实践,考虑到后端系统,在.Net中使用哪种舍入算法进行十进制货币舍入运算?真实世界的经验表示赞赏。


.Net默认情况下使用Banker's Rounding。MidpointRounding.ToEven)这与我将要使用的SQL Server后端不一致,因为SQL Server使用算术舍入(MidpointRounding.AwayFromZero)并且没有内置函数来模仿Banker的舍入。

注意:我在SQL Server中使用小数(18,4),在.Net中使用小数

这是.Net的默认Banker的四舍五入到两位小数,而SQL Server的四舍五入到两位小数的示例:

| Value | .Net  | SQL Server  |
|-------|-------|-------------|
| 2.445 | 2.44  | 2.45        |
| 2.455 | 2.46  | 2.46        |
| 2.465 | 2.46  | 2.47        |
| 3.445 | 3.44  | 3.45        |
| 3.455 | 3.46  | 3.46        |
| 3.465 | 3.46  | 3.47        |

// t-sql
declare @decimalPlaces int
set @decimalPlaces = 2

select round(convert(decimal(18, 4), 2.445), @decimalPlaces) -- 2.45
select round(convert(decimal(18, 4), 2.455), @decimalPlaces) -- 2.46
select round(convert(decimal(18, 4), 2.465), @decimalPlaces) -- 2.47
select round(convert(decimal(18, 4), 3.445), @decimalPlaces) -- 3.45
select round(convert(decimal(18, 4), 3.455), @decimalPlaces) -- 3.46
select round(convert(decimal(18, 4), 3.465), @decimalPlaces) -- 3.47

// .Net
var algorithm = MidpointRounding.ToEven;
var decimalPlaces = 2;
Console.WriteLine(decimal.Round(2.445M, decimalPlaces, algorithm).ToString()); // 2.44
Console.WriteLine(decimal.Round(2.455M, decimalPlaces, algorithm).ToString()); // 2.46
Console.WriteLine(decimal.Round(2.465M, decimalPlaces, algorithm).ToString()); // 2.46
Console.WriteLine(decimal.Round(3.445M, decimalPlaces, algorithm).ToString()); // 3.44
Console.WriteLine(decimal.Round(3.455M, decimalPlaces, algorithm).ToString()); // 3.46
Console.WriteLine(decimal.Round(3.465M, decimalPlaces, algorithm).ToString()); // 3.46

如果我曾经从SQL Server中检索一个值并让它处理舍入,那么与.Net告诉我的内容相比,我会四处走动,因为这是默认的Banker's Rounding。

似乎我应该更进一步,在整个.Net代码库中使用算术舍入法,但是我看到一个使用默认银行家舍入法的开源项目(nopCommerce),这使我想知道最好的方法是什么。


也许更好的问题是:是否有理由不对.Net中的货币使用算术舍入(MidpointRounding.AwayFromZero)?

夜猫子888

银行家的四舍五入在现实世界中很少有意义。我曾经在银行业工作过,他们曾经派我执行任务,以消除由于这一罪魁祸首而导致的报告中的“四舍五入错误”。

除银行业务外,计算运费,所得税和营业税始终使用“从零开始”舍入。

我可以想到的现实世界中对银行家四舍五入的唯一用途是用于计算利息和分割差额或支付佣金。

Microsoft没有选择将默认值设置MidpointRounding.ToEven为有充分的理由。他们这样做是为了保持与Visual Basic(.NET之前)的向后兼容性。这样做不是因为它是合理的默认值,还是任何形式的最佳默认值。如果他们今天必须再次做出决定,那很可能是MidpointRounding.AwayFromZero

请记住,当有人检查您的工作时,他们将使用我们都在小学学习的“远离零”的方法。我认为,“因为微软将其设置为默认值”不足以使程序使用它。如果有必要,在使用银行四舍五入时应该有一个有效的商业理由。如果未在应用程序需求中明确调用它,则应使用MidpointRounding.AwayFromZero最好将应用程序框架中的默认值更改MidpointRounding.AwayFromZero

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在单元测试中使用哪种货币?

来自分类Dev

我们在Asp.net 5 Core中使用哪种加密算法

来自分类Dev

我们在Asp.net 5 Core中使用哪种加密算法

来自分类Dev

在R中使用哪种数据类型或结构来存储货币值和货币?

来自分类Dev

在R中使用哪种数据类型或结构来存储货币值和货币?

来自分类Dev

在C#中使用哪种算法参数:静态,常量,只读?

来自分类Dev

哪种算法在Stream接口中使用排序方法

来自分类Dev

MongoDB对_id使用哪种算法

来自分类Dev

qsort()使用哪种排序算法?

来自分类Dev

内核使用哪种调度算法?

来自分类Dev

我们可以选择在sklearn中使用哪种决策树算法吗?

来自分类Dev

序列化.BestAvailableEncryption(b'mypassword')在python加密库中使用哪种加密算法?

来自分类Dev

@Password公式正在使用哪种哈希算法?

来自分类Dev

python实际使用哪种GC算法?

来自分类Dev

SSL使用哪种对称密钥算法?

来自分类Dev

“加密主目录”使用哪种算法?

来自分类Dev

决定使用哪种机器学习算法

来自分类Dev

Hadoop HDFS 使用哪种复制算法

来自分类Dev

PHP货币换算舍入错误

来自分类Dev

如何舍入货币价值?

来自分类Dev

我们可以指定在Vowpal Wabbit中使用哪种算法(例如决策树,SVM,集成,NN)吗?或者,Automl是否选择算法本身?

来自分类Dev

在mysql中使用IF THEN进行货币转换

来自分类Dev

Java:双舍入算法

来自分类Dev

Java:双舍入算法

来自分类Dev

OpenCV cvtColor()使用哪种灰度转换算法?

来自分类Dev

javascript关联数组使用哪种哈希函数/算法?

来自分类Dev

我应该使用哪种算法对学生进行排序?

来自分类Dev

Tesseract OCR使用哪种阈值(二值化)算法?

来自分类Dev

Hive的内置HASH()函数使用哪种哈希算法

Related 相关文章

  1. 1

    在单元测试中使用哪种货币?

  2. 2

    我们在Asp.net 5 Core中使用哪种加密算法

  3. 3

    我们在Asp.net 5 Core中使用哪种加密算法

  4. 4

    在R中使用哪种数据类型或结构来存储货币值和货币?

  5. 5

    在R中使用哪种数据类型或结构来存储货币值和货币?

  6. 6

    在C#中使用哪种算法参数:静态,常量,只读?

  7. 7

    哪种算法在Stream接口中使用排序方法

  8. 8

    MongoDB对_id使用哪种算法

  9. 9

    qsort()使用哪种排序算法?

  10. 10

    内核使用哪种调度算法?

  11. 11

    我们可以选择在sklearn中使用哪种决策树算法吗?

  12. 12

    序列化.BestAvailableEncryption(b'mypassword')在python加密库中使用哪种加密算法?

  13. 13

    @Password公式正在使用哪种哈希算法?

  14. 14

    python实际使用哪种GC算法?

  15. 15

    SSL使用哪种对称密钥算法?

  16. 16

    “加密主目录”使用哪种算法?

  17. 17

    决定使用哪种机器学习算法

  18. 18

    Hadoop HDFS 使用哪种复制算法

  19. 19

    PHP货币换算舍入错误

  20. 20

    如何舍入货币价值?

  21. 21

    我们可以指定在Vowpal Wabbit中使用哪种算法(例如决策树,SVM,集成,NN)吗?或者,Automl是否选择算法本身?

  22. 22

    在mysql中使用IF THEN进行货币转换

  23. 23

    Java:双舍入算法

  24. 24

    Java:双舍入算法

  25. 25

    OpenCV cvtColor()使用哪种灰度转换算法?

  26. 26

    javascript关联数组使用哪种哈希函数/算法?

  27. 27

    我应该使用哪种算法对学生进行排序?

  28. 28

    Tesseract OCR使用哪种阈值(二值化)算法?

  29. 29

    Hive的内置HASH()函数使用哪种哈希算法

热门标签

归档