关于SO的算术问题太多,特别是浮点数,因此我将两个问题合并在一起。
df_A = pd.DataFrame({'Col1': ['AA', 'BB', 'CC', 'DD', 'AA'], 'Col2': [1, 2, 3, 4, 5]})
list_B = ('AA','CC')
>双0.3333333
?这是证明它的程序。
0.333333333333333
static void Main(string[] args)
{
int a = 1;
int b = 3;
float f = Convert.ToSingle(a) / Convert.ToSingle(b);
double db = Convert.ToDouble(a) / Convert.ToDouble(b);
Console.WriteLine(f > db);
Console.Read();
}
不能隐式转换为float
但decimal
可以转换?例如
int
答案 0 :(得分:5)
对于第一个问题,当您在float
上使用double
运算符时,实际上会将它们转换为>
。如果您打印(double)f
,则会看到其值:
0.333333343267441
db
是:
0.333333333333333
对于第二个问题,尽管没有从float
到decimal
的隐式转换,但是有一个显式的转换,因此可以使用强制转换:
float a = 0.1f;
decimal d = (decimal)a;
我在语言规范中找不到关于为什么的任何内容,但是我推测这种转换不是您应该执行的操作,因此您需要对其进行明确说明。你为什么不这样做呢?因为decimal
应该代表离散量,例如货币,而float
和double
应该代表连续量。它们代表了两个截然不同的事物。
答案 1 :(得分:2)
将源文本中的数字(例如.3333333
)转换为浮点数时,会将它们舍入为最接近的可表示值。恰好是最接近float
的{{1}}值略大于.3333333;它是0.333333313465118408203125,而最接近0.333333333333333333的.3333333
值则略小于该值;它是0.333333333333332981762708868700428865849971771240234375。由于0.333333313465118118203125大于0.333333333333332981762708868700428865849971771240234375,因此double
的计算结果为true。
我不熟悉C#的规则及其十进制类型。但是,我怀疑允许f > db
时不允许使用decimal d1 = 0.1f;
的原因是并非所有decimal d2 = 1;
的值都可以无误地转换为float
,而所有decimal
值可以正确转换为int
。 According to Microsoft,decimal
使用96位有效数字,足以精确表示任何decimal
。但是,它的范围小于int
,其最大有限值为2 96 -1,大约7.9228•10 28 。最大有限float
是2 128 −2 104 ,大约是3.4028•10 38 。