【问题标题】:Is it OK to multiply a decimal with an int?用整数乘以小数可以吗?
【发布时间】:2011-12-16 19:25:17
【问题描述】:

我是 C# 和 .NET 的新手,所以如果这是一个太简单的问题,我很抱歉。

我有一个十进制变量decVar。 我需要将它与整数变量intVar 相乘。 我需要结果为decimal。 那么我应该将整数变量声明为int 还是decimal

有了这个代码,

decimal decVar = 0.1m;
decimal decRes = decVar * intVar;

我应该这样声明吗:

int intVar = 3;

或者像这样:

decimal intVar = 3;

?

这是一个财务计算,所以我需要结果正好是0.3

upd:代码已更新(感谢 Jon)

【问题讨论】:

    标签: c# .net int decimal type-conversion


    【解决方案1】:

    没关系 - int 无论如何都会转换为 decimal:没有 *(decimal, int) 运算符,只有 *(int, int)*(decimal, decimal)。 (当然还有其他类型。)

    现在decimal 不能隐式转换为int,但反向转换是有效的——这就是编译器所做的。

    但是,您需要更改 decVar 的声明,因为目前赋值运算符的右侧是双精度数,而不是小数。你的意思是0.1m。你也需要分号:)

    【讨论】:

      【解决方案2】:

      这并没有什么不同。由于乘法的一个参数是decimal,因此另一个参数也将转换为decimal(如果它还不是一个)。

      这次转化是always safe:

      转化注意事项

      此类型提供将 Decimal 值与 Decimal 值相互转换的方法 SByte、Int16、Int32、Int64、字节、UInt16、UInt32 和 UInt64。 从这些整数类型到 Decimal 的转换正在扩大 永远不会丢失信息或引发异常的转换。

      【讨论】:

        【解决方案3】:

        声明为intdecimal 都没有关系。它将被转换为decimal 进行计算。

        此外,您永远无法保证浮点精度,因为有些数字无法以二进制精确表示。您将不得不采取其他预防措施以尽量减少舍入误差。

        【讨论】:

        • 赞成指出浮点数二进制表示存在的问题。
        • 有些数字也不能精确地用十进制表示。例如 1m / 5m 不是不精确的,但 1d / 5d 是。
        猜你喜欢
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-10
        • 2023-03-05
        相关资源
        最近更新 更多