让我们来玩一下浮点数,并看看为什么它不起作用。
假设从 SQL 中读取了一个 24 位数字 1.23456789012345678901234,然后将其转换为 .Net 的 float 类型。
浮点数的二进制表示如下:0 01111111 00111100000011001010010。
第一个 0 是符号位,表示这个数是正数。01111111 是偏置指数,表示有效数字乘以 2^0(或 1)。00111100000011001010010 是数字的各位,减去第一位。
因此,浮点变量现在将数字 1.00111100000011001010010 编码为二进制数。
让我们看看当我们将该浮点数转换为十进制数时会发生什么。
1 * 1 = 1
.
0 * 0.5 = 0
0 * 0.25 = 0
1 * 0.125 = 0.125
1 * 0.0625 = 0.0625
1 * 0.03125 = 0.03125
1 * 0.015625 = 0.015625
0 * 0.0078125 = 0
0 * 0.00390625 = 0
0 * 0.001953125 = 0
0 * 0.0009765625 = 0
0 * 0.00048828125 = 0
0 * 0.000244140625 = 0
1 * 0.0001220703125 = 0.0001220703125
1 * 0.00006103515625 = 0.00006103515625
0 * 0.000030517578125 = 0
0 * 0.0000152587890625 = 0
1 * 0.00000762939453125 = 0.00000762939453125
0 * 0.000003814697265625 = 0
1 * 0.0000019073486328125 = 0.0000019073486328125
0 * 0.00000095367431640625 = 0
0 * 0.000000476837158203125 = 0
1 * 0.0000002384185791015625 = 0.0000002384185791015625
0 * 0.00000011920928955078125 = 0
------------------------
1.2345678806304931640625
因此,如果我们显示浮点数的所有数字,我们得到1.2345678806304931640625。
那么这不是我们想要显示的数字吗?为什么会四舍五入这个数字?而且为什么这个值与我们开始的数字不同呢?
为了理解原因,让我们逐步查看一些相邻的浮点值:
binary floating point representation decimal representation
0 01111111 00111100000011001010000 = 1.2345676422119140625
0 01111111 00111100000011001010001 = 1.23456776142120361328125
0 01111111 00111100000011001010010 = 1.2345678806304931640625
0 01111111 00111100000011001010011 = 1.23456799983978271484375
0 01111111 00111100000011001010100 = 1.234568119049072265625
正如您所看到的,完全相同的浮点数用于表示此范围内的所有值:[1.234567821025848388671875,1.234567940235137939453125)
因此,在转换为浮点数时,第八位之后的任何小数位都会丢失,并且可能显示的任何数字都是完全无意义的,与实际表示的值无关。
第八位之后的所有小数位都是将24位二进制数四舍五入并转换为十进制数的结果,它们没有任何实际意义。
float
转换成一个 24 位数的字符串。如果你愿意接受 9 位数,那么可以看一下我的回答的第一部分。 - SLaks