当前位置: 首页 > 知识库问答 >
问题:

由于'decimal'*'decimal'操作会导致精度损失,但已被授权,为什么'decimal'*'double'操作被禁止?

罗学真
2023-03-14

我知道decimal是一种数字格式,一般适用于金融和货币,因为它具有固定的精度。

因此,当对两个小数进行相加或相加时,绝不会丢失精度。

然后M=a*a=0.0001,截断为0.00,因此精度下降。

尽管丢失了精度,但编译器认为此操作是合法的。

所以我们在C#中有以下情况:

    null
    null

考虑到所有这些,我的问题是:

C#编译器禁止'Decimal'*'Double'有什么原因吗?

共有1个答案

田彬郁
2023-03-14

十进制乘法(*)运算符只接受decimal类型的操作数。但是,存在从intdecimal的隐式转换,因此编译器将int转换为decimal

从技术上讲,没有从decimaldouble的隐式强制转换(反之亦然,因此编译器无法为您强制转换;您需要显式强制转换其中一个操作数。

从逻辑上讲,您需要对最后一个进行强制转换,因为编译器需要知道结果的类型。对于前三个类型是明确的-它们都导致decimal,因为从intdecimal的隐式转换。

但是decimal*double的结果应该是什么?它可以是decimaldouble,这取决于您的需要。如果您将它赋值给变量,那么编译器可以推断,但如果它是内联的呢?M*a+1的类型是什么?

因此,您需要强制转换来告诉编译器结果类型是什么。

在处理利率、增值税率或一般利率时,我认为使用double来存储这些值更符合逻辑

double应用于不精确的科学测量(温度、距离)和其他速度比十进制表示的准确性更重要的计算。

 类似资料:
  • 使用databricks spark-avro在spark中创建数据帧后,当我试图使用sum函数求和TOT_AMT列时,它会抛出“function sum requires numeric types not binarytype”错误。 该列在avro模式中定义如下, name=“tot_amt”,“type”:[“null”,{“type”:“bytes”,“logicaltype”:“dec

  • 我遇到了奇怪的问题时,铸造小数到双倍。 以下代码返回true: 但是,当我将其强制转换为双倍时,它返回false: 这是记录在案的行为吗?当我被迫将decimal转换为Double时,我如何避免它? Visual Studio的截图: 将Math.round铸造为双倍me,结果如下: null 不幸的是,我不能在较小的项目中重现这个问题。我想埃里克的回答解释了原因。

  • 试图创建一个十进制(或NSDecimalNumber)从给定的双倍性价比计算在我的应用程序。我在Xcode10中使用Swift4。 但它会生成以下错误的值。 我如何用SWIFT从给定的双倍值中生成一个小数?

  • 当<code>BigDecimal</code>与<code>double</code>和<code>bigDecical</code>与<code>String</code>输入一起使用时,似乎会出现不同的结果。 x 输出为 而y是 我说这是因为双重不精确是错的吗?但既然这是一个,它不应该是一样的吗?

  • Decimal # decimal_create.py import decimal fmt = '{0:<25} {1:<25}' print(fmt.format('Input', 'Output')) print(fmt.format('-' * 25, '-' * 25)) # Integer print(fmt.format(5, decimal.Decimal(5))) # S

  • 问题内容: 有人可以解释一下我在Teradata中得到的以下结果: 结果是: 我期待DECIMAL(18,4) 问题答案: 每个DBMS在涉及小数的计算方面都有其自己的规则。 Teradata的基本规则是:当您将DECIMALs相加/相减/相除时,所得的分数精度是两个操作数中较大的一个,例如dec(10,2)+ dec(10,4)= dec(xx,4) 但是,当您乘以小数位时,例如,decdec(