当我将python float 77422223.0转换为spark FloatType时,我得到的是77422224。如果我使用DoubleType进行转换,我得到的是77422223。这种转换是如何工作的?有没有办法计算何时会发生这种错误?
df = spark.createDataFrame([77422223.0],FloatType())
display(df)
输出功率
并按预期运行
df = spark.createDataFrame([77422223.0],DoubleType())
display(df)
收益率
1条答案
按热度按时间6jjcrrmo1#
此转换是如何工作的...
我假设Spark
FloatType
是IEEE-754 binary 32。该格式使用24位有效位和-126到+127的指数范围。每个数字表示为一个符号和一个24位数字,在其第一位数字乘以2的指数幂后带有.“”。例如+1.01001100001111100000002 213。在二进制中,77,422,223为10010011101011110100011112。即27位。因此,它不能以binary 32格式表示。当它转换为binary 32格式时,转换操作将其舍入为最接近的可表示值。即10010011101011110100010002。其具有23个有效数字。
......是否有办法计算何时会发生此类错误?
当数字以二进制表示时,如果从第一个1到最后一个1(包括这两个1)的位数大于24,则它不能以binary 32格式表示。
同样,如果数的大小小于2 - 126,则不能用binary 32表示,除非它是2 - 149的倍数(包括0)。在这个范围内的数是次正规数,有固定的指数-126,有效数的最低位的位置值为2 - 149。如果数的大小等于或大于2128,则不能用binary 32表示。除非它是+∞或-∞。