我试图从我的列表中得到一些元素的和。每个元素都有一个名为quantity的整数属性。
我的元素:
class EmbeddedElement : EmbeddedRealmObject {
var totalPrice: Double = 0.0
var discount: Double = 0.0
var quantity: Int = 1
}
我试图得到元素的总价格之和。
***myElementsList***具有唯一元素。
问题是,每当我尝试将totalPrice值乘以***$0.quantity***时,它都不会生成。
编译器无法在合理的时间内对此表达式进行类型检查;尝试将表达式分解为不同的子表达式
例如,这不起作用(当乘以$0.quantity时):
Text("\((myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*$0.quantity}).reduce(0,+)), specifier: "%.2f") dollar ")
但是乘以简单数***5***或任何其他数都可以:
Text("\((myElementsList.map({($0.totalPrice-($0.totalPrice*$0.discount/100))*5}).reduce(0,+)), specifier: "%.2f") dollar ")
为什么会发生这种情况?是因为$0.quantity是一个整数值吗?我试过铸造,但没有工作。任何解决方案?
2条答案
按热度按时间2w2cym1i1#
你在计算的第一部分乘以双精度数,计算中的所有内容都应该是双精度数。如果你把整数初始化为双精度数,它就可以工作。
双倍($0.数量)
数学在操场上用这个很好用。最好在运算符周围留出空格,因为我在上面有几个标志。
在第二个calc中使用静态值5是有效的,因为它知道calc是double,结果也是double,所以它有效地将5“初始化”为double。
在处理价格和货币时,您可能需要查看Decimal类型,正如您在我的简单示例中所看到的,双精度可能导致小数位过长,需要四舍五入,这可能导致许多值之间存在微小差异。
我猜您看到的错误是模糊的,因为它相当复杂,并且类型系统正在努力提供一些有意义的东西。
z4bn682m2#
我认为问题中的代码大部分是正确的。我不能保证数学公式是正确的,但代码是正确的。下面是如何排除故障
获取您的初始代码
让我们把它分成几个部分,以便检查,删除公式,留下文本格式代码
然后这个方程
啊,现在问题很明显,这个错误是我在评论中提到的用一个双精度数乘以一个整数。2修正这个方程很容易! 3把整数转换成一个双精度数,然后计算就可以工作了。
不要太复杂!
然后将其插回文本代码
而且很管用。
注:
请看宏创的回答中关于使用货币中的双精度的评论和我的后续评论。使用Decimal128。
产出:
反之
产出: