none
浮点转换双精度浮点的问题 RRS feed

  • 问题

  • 代码是这样的

                float ff = 0.09f;
                double dd = (float)ff;
                Console.WriteLine(dd);
                //结果是0.0900000035762787
                Console.ReadLine();

    关于这一段代码我验算的时候发现怎么算都算不出这个0.0900000035762787的结果...

    我的验算步骤如下,还希望知道的朋友说一下错在哪里..

    首先0.09装换成二进制如下

    0.00010111000010100011110101110000....(循环)

    然后将这个二进制小数点移位并截取24位

    1.01110000101000111101011(<-24位) 1(<-25位是1,所以要进位)最后得到

    1.01110000101000111101100

    去掉最前端的1将后面的23位储存到单精度浮点数32bit内存的最后22~0位中..(关于前面的31~23位这里无关紧要就不写出来了)

    01110000101000111101100 (这个就是储存在单精度浮点数32bit内存的最后22~0位中的数值)

    现在问题来了~

    将这个转换成双精度那么就要先还原

    前端补1

    1.01110000101000111101100

    小数点左移4位

    0.000101110000101000111101100

    问题在这里了。这个值..转换成双精度浮点数..

    我不论是取00010111000010100011111(23位)去还原..还是取000101110000101000111101100(27位)去还原

    最后的结果都不会是0.0900000035762787

    我用(都转化成十进制之后除)

    00010111000010100011111除以23个1,

    或者用

    000101110000101000111101100除以27个1

    最后结果都不对..

    不知道这是为什么?

    还希望知道的朋友帮看一下~谢谢了..

    2012年6月9日 11:10

答案

  • 问题解决了...刚才发了个癫 直接算到52位...就是双精度的指数位的那个52位..结果用

    000101110000101000111101100..(这后面还有25个0)除以52个1

    结果就正确了..结果是0.0900000035762787

    ....感谢上帝..俺算了一下午=。=


    • 已标记为答案 蓝色堇 2012年6月9日 12:57
    • 已编辑 蓝色堇 2012年6月9日 13:01
    2012年6月9日 11:19

全部回复

  • 问题解决了...刚才发了个癫 直接算到52位...就是双精度的指数位的那个52位..结果用

    000101110000101000111101100..(这后面还有25个0)除以52个1

    结果就正确了..结果是0.0900000035762787

    ....感谢上帝..俺算了一下午=。=


    • 已标记为答案 蓝色堇 2012年6月9日 12:57
    • 已编辑 蓝色堇 2012年6月9日 13:01
    2012年6月9日 11:19
  • 你好有心啊,居然算的这么久。

    快乐在于能够长时间的为自己认为值得的事情努力工作,不管它是什么。

    2012年6月9日 11:43
  • ...哎..总之现在有个毛病..遇到没解决的问题..就一直去想啊想啊..我都害怕有那么一天遇到个永远想不明白的...

    =。=

    2012年6月9日 12:59