我不理解二进制浮点和十进制浮点这两个术语。我知道浮点数(32位)和双打(64位)是二进制浮点数,十进制数(128位)是十进制浮点数。我理解十进制是基数10,二进制是基数2.但是,我不明白为什么小数是基数10,因为最终一切都是基数2?为什么小数基数为10,而不是基数2,如浮点和双精度?
我今天看了很多网站,例如这个:Difference between decimal, float and double in .NET?
答案 0 :(得分:9)
简短回答:您可以用十进制表示形式表示“简单”十进制数字,例如0.1,但只能用二进制表示约。
通常,人们使用“十进制”类型的原因是为了代表金钱,这通常包含大值和小分数(100分)。十进制类型最适合跟踪这些类型的数字,并且不会产生舍入错误产生结果的风险,如10.09999999999999。
答案 1 :(得分:7)
浮点数由符号(+或 - ),有效数和指数组成。 有效数字由许多基数B数字组成。指数e的解释是该数字应乘以B e 。选择B为2或10对小整数没有影响(0,1,2,...可以在二进制浮点和十进制浮点中完全表示)但是分数和非常大的数字可以用二进制和十进制表示的确不完全相同。
示例:二进制浮点可以精确地表示2 -100 和2 100 ,但decimal128不能。十进制浮点可以精确地表示0.1,但二进制浮点不能(以任何精度)。
你说得对,最后一切都是二元的。许多方案用于将十进制浮点表示为位。有效数是编码的棘手部分。 IEEE标准化委员会设计了two schemes,一个方便软件,一个方便硬件解码。我不知道.NET使用什么。它可能使用类似于IEEE 754浮点标准中的“二进制整数有效位字段”技术,其中分配的位用于以二进制形式编码0到B n 之间的数字 - 1,因为这是软件中最好的。