【问题标题】:InlineData xUnit rounding 9999999999999999.99 to 10000000000000000 decimal parameter [duplicate]InlineData xUnit舍入9999999999999999.99到10000000000000000十进制参数[重复]
【发布时间】:2021-12-07 17:52:05
【问题描述】:

如上所述,我有一些关于接收小数(18,2)参数的理论要测试。这意味着,据推测,应该接受左侧的 16 个整数和两个整数小数,最高数可能为 9999999999999999.99。

[Theory]
[InlineData(999.99)]
[InlineData(9999999999999999.99)] 
[InlineData(0000000000000000.01)]
public void A_Cool_Test_Case(decimal decimalCoolValues)
{
     //...

但是,xUnit 将此值设为 10000000000000000。这是正常行为还是我在这里遗漏了什么?

【问题讨论】:

  • 请编辑您的问题以提供代码作为文本而不是图像。代码本质上是文本 - 最好以各种可能的方式将其作为问题中的文本。 (一方面,如果您这样做了,我可能会复制/粘贴并将其编辑到我的答案中 - 但我不打算重新输入整个内容。)

标签: c# unit-testing decimal rounding xunit


【解决方案1】:

不,xUnit 没有四舍五入。编译器是,因为您对可以存储在 double 值中的内容有不合理的期望。

来自docs

Double 值最多有 15 位小数精度,但内部最多保留 17 位。

所以试图存储 18 位数字真的是自找麻烦。

您的文字是 double 文字,但您有一个 decimal 参数。不幸的是,您不能在属性中指定 decimal 文字,但在这种情况下,我建议将值指定为字符串文字。 可能xUnit 会为您解析,您可以保留decimal 参数...否则,将其更改为string 参数并在您的测试中自己解析该值。

【讨论】:

  • 谢谢乔恩!我遇到了问题,因为它是直接将 InlineData 中的 Double 转换为参数,所以你在其他问题建议中的回答就成功了!真的感谢您的帮助! :)
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多