与许多语言一样,Swift的除法运算符默认为整数除法,因此:
let n = 1 / 2
print(n) // 0
如果要进行浮点除法,必须执行以下操作
let n1 = 1.0 / 2
let n2 = 1 / 2.0
let n3 = Double(1) / 2
let n4 = 1 / Double(2)
print(n1) // 0.5
print(n2) // 0.5
print(n3) // 0.5
print(n4) // 0.5
同样,与大多数其他语言一样,您不能强制转换整个操作:
let n5 = Double(1 / 2)
print(n5) // 0.0
发生这种情况是因为swift执行1和2的整数除法(1/2
)并获得0,然后它尝试将其转换为Double
,有效地为您提供0.0。
我很好奇为什么以下方法会奏效:
let n6 = (1 / 2) as Double
print(n6) // 0.5
我觉得这应该会产生与双倍(1/2)相同的结果。为什么不呢?
1和
2是文本。他们没有类型,除非你从上下文中给他们一个类型。
let n6 = (1 / 2) as Double
本质上与
let n6: Double = 1 / 2
这意味着,您告诉编译器结果是一个双精度的。这意味着编译器将搜索带有双精度结果的运算符,这意味着它将在两个双精度操作数上找到运算符,因此将这两个文本视为双精度类型。
另一方面
let n5 = Double(1 / 2)
是强制转换(或者更好地说,
Double
的初始化)。这意味着表达式1/2
首先被评估,然后转换为Double
。
加宽基元转换19基元类型上的特定转换称为加宽基元转换: 字节到短、int、long、float或double 短到int、long、float或double 字符为int、long、float或double 从int到long、float或double 长时间浮动还是加倍? 浮动到双倍 如果浮点数为32位,而长点数为64位,那该如何被认为是加宽的呢?这难道不应该被认为是缩小范围吗?
但如果将浮点数或整数减小或增大一定量,则比较运行得快得多: 更改比较运算符(例如,改用或)不会以任何明显的方式影响时间。 这不仅仅与幅度有关,因为选择较大或较小的值会导致更快的比较,所以我怀疑这是由于位排列的某种不幸方式造成的。
问题内容: 问题很简单而且简短:为什么要清除浮动?我查看了w3标准文档,但没有任何暗示。 问题答案: 因为当您与其他任何东西一起使用时会建立一个新的块格式设置上下文(链接到w3.org规范)。
我正在用python研究基本微积分和阶乘。试图从牛顿级数生成PI,但我不能超过171次迭代,因为这个错误:overflowerrror:int太大,无法转换为float。代码如下: 我导入了这个:从数学导入阶乘,gamma/从数学导入sqrt
问题内容: 我有一个必须解析的二进制文件,并且正在使用Python。有没有办法占用4个字节并将其转换为单个精度浮点数? 问题答案:
问题内容: 有点像这个问题,但是相反。 给定类似,或的字符串,将其转换为浮点数的最佳方法是什么?我正在考虑根据情况使用正则表达式,但是也许有人知道更好的方法或预先存在的解决方案。我希望可以使用,但是我认为第3种情况可以避免这种情况。 问题答案: 我稍微调整了詹姆斯的回答。 http://ideone.com/ItifKv