为什么在计算相同的值后float大于两倍?为什么不能将float隐式转换为Decimal

时间:2018-07-01 06:59:06

标签: c# math floating-point

关于SO的算术问题太多,特别是浮点数,因此我将两个问题合并在一起。

  1. 为什么要浮动df_A = pd.DataFrame({'Col1': ['AA', 'BB', 'CC', 'DD', 'AA'], 'Col2': [1, 2, 3, 4, 5]}) list_B = ('AA','CC') >双0.3333333

这是证明它的程序。

0.333333333333333
  1. 为什么 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(); } 不能隐式转换为floatdecimal可以转换?

例如

int

2 个答案:

答案 0 :(得分:5)

对于第一个问题,当您在float上使用double运算符时,实际上会将它们转换为>。如果您打印(double)f,则会看到其值:

0.333333343267441

db是:

0.333333333333333

对于第二个问题,尽管没有从floatdecimal的隐式转换,但是有一个显式的转换,因此可以使用强制转换:

float a = 0.1f; 
decimal d = (decimal)a;

我在语言规范中找不到关于为什么的任何内容,但是我推测这种转换不是您应该执行的操作,因此您需要对其进行明确说明。你为什么不这样做呢?因为decimal应该代表离散量,例如货币,而floatdouble应该代表连续量。它们代表了两个截然不同的事物。

答案 1 :(得分:2)

  1. 将源文本中的数字(例如.3333333)转换为浮点数时,会将它们舍入为最接近的可表示值。恰好是最接近float的{​​{1}}值略大于.3333333;它是0.333333313465118408203125,而最接近0.333333333333333333的.3333333值则略小于该值;它是0.333333333333332981762708868700428865849971771240234375。由于0.333333313465118118203125大于0.333333333333332981762708868700428865849971771240234375,因此double的计算结果为true。

  2. 我不熟悉C#的规则及其十进制类型。但是,我怀疑允许f > db时不允许使用decimal d1 = 0.1f;的原因是并非所有decimal d2 = 1;的值都可以无误地转换为float,而所有decimal值可以正确转换为intAccording to Microsoftdecimal使用96位有效数字,足以精确表示任何decimal。但是,它的范围小于int,其最大有限值为2 96 -1,大约7.9228•10 28 。最大有限float是2 128 −2 104 ,大约是3.4028•10 38