Python论坛  - 讨论区

标题:[python-chinese] 浮点数型的字符串如何转化为浮点数?

2006年11月06日 星期一 13:07

苏亚 su1981ya在163.com
星期一 十一月 6 13:07:21 HKT 2006

我有个数据文件,内容为
version: 1
n_points: 43
{
64.2019 138.498
75.5079 192.606
109.022 226.927
130.019 231.773
147.785 225.312
179.281 192.606
190.183 136.883
67.836 166.763
90.4479 211.18
165.552 209.968
186.953 163.129
76.7192 115.483
96.9085 107.407
112.656 115.079
96.1009 113.464
84.795 109.022
104.984 107.811
104.58 113.464
85.1987 113.868
139.71 118.713
159.091 108.215
180.896 119.117
159.495 113.464
148.997 110.637
170.397 109.426
169.994 114.271
150.208 115.886
79.9495 129.615
95.6972 123.558
110.637 130.826
95.2934 131.634
86.8139 125.577
103.369 123.962
102.965 131.634
86.4101 131.634
144.555 131.634
159.091 124.366
175.647 130.423
159.091 132.845
150.208 125.577
165.552 125.981
165.552 132.442
151.016 133.249
}
现在我想把这个文件中的数据保存到内存,并对其进行归一化后保存到另一个文件
中,请问各位我应该怎么做?
我本以为可以直接用int()进行转换,但后来发现这种方法并不适合浮点数。下
面是我的程序:
def readpoints(filename):
point = open(filename)
a = point.readlines()
number = int(a[1][-3:-1])
p= []
for add in a[3:3+number]:
p1 = int(add[0])
p2 = int(add[1][0:-2])
p.append([p1,p2])
return p

或者我的方法还有什么不太好的地方,请大家帮我指出来?谢谢!





[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 13:13

Yunfeng Tao taoyfeng在gmail.com
星期一 十一月 6 13:13:36 HKT 2006

float()

2006/11/6, 苏亚 <su1981ya在163.com>:
> 我有个数据文件,内容为
> version: 1
> n_points: 43
> {
> 64.2019 138.498
> 75.5079 192.606
> 109.022 226.927
> 130.019 231.773
> 147.785 225.312
> 179.281 192.606
> 190.183 136.883
> 67.836 166.763
> 90.4479 211.18
> 165.552 209.968
> 186.953 163.129
> 76.7192 115.483
> 96.9085 107.407
> 112.656 115.079
> 96.1009 113.464
> 84.795 109.022
> 104.984 107.811
> 104.58 113.464
> 85.1987 113.868
> 139.71 118.713
> 159.091 108.215
> 180.896 119.117
> 159.495 113.464
> 148.997 110.637
> 170.397 109.426
> 169.994 114.271
> 150.208 115.886
> 79.9495 129.615
> 95.6972 123.558
> 110.637 130.826
> 95.2934 131.634
> 86.8139 125.577
> 103.369 123.962
> 102.965 131.634
> 86.4101 131.634
> 144.555 131.634
> 159.091 124.366
> 175.647 130.423
> 159.091 132.845
> 150.208 125.577
> 165.552 125.981
> 165.552 132.442
> 151.016 133.249
> }
> 现在我想把这个文件中的数据保存到内存,并对其进行归一化后保存到另一个文件
> 中,请问各位我应该怎么做?
> 我本以为可以直接用int()进行转换,但后来发现这种方法并不适合浮点数。下
> 面是我的程序:
> def readpoints(filename):
> point = open(filename)
> a = point.readlines()
> number = int(a[1][-3:-1])
> p= []
> for add in a[3:3+number]:
> p1 = int(add[0])
> p2 = int(add[1][0:-2])
> p.append([p1,p2])
> return p
>
> 或者我的方法还有什么不太好的地方,请大家帮我指出来?谢谢!
>
>
>
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 13:23

苏亚 su1981ya在163.com
星期一 十一月 6 13:23:20 HKT 2006

Yunfeng Tao 写道:
> float()
>
> 2006/11/6, 苏亚 <su1981ya在163.com>:
>   
>> 我有个数据文件,内容为
>> version: 1
>> n_points: 43
>> {
>> 64.2019 138.498
>> 75.5079 192.606
>> 109.022 226.927
>> 130.019 231.773
>> 147.785 225.312
>> 179.281 192.606
>> 190.183 136.883
>> 67.836 166.763
>> 90.4479 211.18
>> 165.552 209.968
>> 186.953 163.129
>> 76.7192 115.483
>> 96.9085 107.407
>> 112.656 115.079
>> 96.1009 113.464
>> 84.795 109.022
>> 104.984 107.811
>> 104.58 113.464
>> 85.1987 113.868
>> 139.71 118.713
>> 159.091 108.215
>> 180.896 119.117
>> 159.495 113.464
>> 148.997 110.637
>> 170.397 109.426
>> 169.994 114.271
>> 150.208 115.886
>> 79.9495 129.615
>> 95.6972 123.558
>> 110.637 130.826
>> 95.2934 131.634
>> 86.8139 125.577
>> 103.369 123.962
>> 102.965 131.634
>> 86.4101 131.634
>> 144.555 131.634
>> 159.091 124.366
>> 175.647 130.423
>> 159.091 132.845
>> 150.208 125.577
>> 165.552 125.981
>> 165.552 132.442
>> 151.016 133.249
>> }
>> 现在我想把这个文件中的数据保存到内存,并对其进行归一化后保存到另一个文件
>> 中,请问各位我应该怎么做?
>> 我本以为可以直接用int()进行转换,但后来发现这种方法并不适合浮点数。下
>>     
>
hehe,
有时我觉得我的问题实在太简单了,谢谢


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 13:49

唐国巍 tdavid77在tom.com
星期一 十一月 6 13:49:40 HKT 2006

苏亚 写道:
> 我有个数据文件,内容为
> version: 1
> n_points: 43
> {
> 64.2019 138.498
> 75.5079 192.606
> 109.022 226.927
> 130.019 231.773
> 147.785 225.312
> 179.281 192.606
> 190.183 136.883
> 67.836 166.763
> 90.4479 211.18
> 165.552 209.968
> 186.953 163.129
> 76.7192 115.483
> 96.9085 107.407
> 112.656 115.079
> 96.1009 113.464
> 84.795 109.022
> 104.984 107.811
> 104.58 113.464
> 85.1987 113.868
> 139.71 118.713
> 159.091 108.215
> 180.896 119.117
> 159.495 113.464
> 148.997 110.637
> 170.397 109.426
> 169.994 114.271
> 150.208 115.886
> 79.9495 129.615
> 95.6972 123.558
> 110.637 130.826
> 95.2934 131.634
> 86.8139 125.577
> 103.369 123.962
> 102.965 131.634
> 86.4101 131.634
> 144.555 131.634
> 159.091 124.366
> 175.647 130.423
> 159.091 132.845
> 150.208 125.577
> 165.552 125.981
> 165.552 132.442
> 151.016 133.249
> }
> 现在我想把这个文件中的数据保存到内存,并对其进行归一化后保存到另一个文件
> 中,请问各位我应该怎么做?
> 我本以为可以直接用int()进行转换,但后来发现这种方法并不适合浮点数。下
> 面是我的程序:
> def readpoints(filename):
> point = open(filename)
> a = point.readlines()
> number = int(a[1][-3:-1])
> p= []
> for add in a[3:3+number]:
> p1 = int(add[0])
> p2 = int(add[1][0:-2])
> p.append([p1,p2])
> return p
> 
> 或者我的方法还有什么不太好的地方,请大家帮我指出来?谢谢!
> 
> 
> 
> 
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
int()只能转变成整型,对于浮点数用float().
但是转换后得到的结果有时与原字符串不一致,还需要再处理一下。


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 15:12

fdu.xiaojf在gmail.com fdu.xiaojf在gmail.com
星期一 十一月 6 15:12:08 HKT 2006

唐国巍 wrote:
> 苏亚 写道:
>   
>>     
snip
>>
>>
>>     
> int()只能转变成整型,对于浮点数用float().
>   

  用eval()也可以的
> 但是转换后得到的结果有时与原字符串不一致,还需要再处理一下。
>
>   
请问应该怎么处理?

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 15:21

limodou limodou在gmail.com
星期一 十一月 6 15:21:24 HKT 2006

> 请问应该怎么处理?

如果你要的就是内部的浮点数,根本不需要处理,精度只有在输出为字符串的时候才需要处理。

-- 
I like python!
UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 19:48

Yung-Yu Chen yyc在seety.org
星期一 十一月 6 19:48:32 HKT 2006

from numpy import fromstring

strdata = open( "file.txt" ).read()
st = strdata.find( '{' )
en = strdata[st:].find( '}' )
data = fromstring( strdata[st:st+en], dtype=float, sep=' ' )

這樣寫會比 map( float, strdata.split() ) 快很多喔。
當然,numpy 是另外裝的。

On 11/6/06, 苏亚 <su1981ya在163.com> wrote:
>
> Yunfeng Tao 写道:
> > float()
> >
> > 2006/11/6, 苏亚 <su1981ya在163.com>:
> >
> >> 我有个数据文件,内容为
> >> version: 1
> >> n_points: 43
> >> {
> >> 64.2019 138.498
> >> 75.5079 192.606
> >> 109.022 226.927
> >> 130.019 231.773
> >> 147.785 225.312
> >> 179.281 192.606
> >> 190.183 136.883
> >> 67.836 166.763
> >> 90.4479 211.18
> >> 165.552 209.968
> >> 186.953 163.129
> >> 76.7192 115.483
> >> 96.9085 107.407
> >> 112.656 115.079
> >> 96.1009 113.464
> >> 84.795 109.022
> >> 104.984 107.811
> >> 104.58 113.464
> >> 85.1987 113.868
> >> 139.71 118.713
> >> 159.091 108.215
> >> 180.896 119.117
> >> 159.495 113.464
> >> 148.997 110.637
> >> 170.397 109.426
> >> 169.994 114.271
> >> 150.208 115.886
> >> 79.9495 129.615
> >> 95.6972 123.558
> >> 110.637 130.826
> >> 95.2934 131.634
> >> 86.8139 125.577
> >> 103.369 123.962
> >> 102.965 131.634
> >> 86.4101 131.634
> >> 144.555 131.634
> >> 159.091 124.366
> >> 175.647 130.423
> >> 159.091 132.845
> >> 150.208 125.577
> >> 165.552 125.981
> >> 165.552 132.442
> >> 151.016 133.249
> >> }
> >> 现在我想把这个文件中的数据保存到内存,并对其进行归一化后保存到另一个文件
> >> 中,请问各位我应该怎么做?
> >> 我本以为可以直接用int()进行转换,但后来发现这种方法并不适合浮点数。下
> >>
> >
> hehe,
> 有时我觉得我的问题实在太简单了,谢谢
>
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese




-- 
with regards,
Yung-Yu Chen

http://yungyuc.net/
-------------- 下一部分 --------------
一个HTML附件被移除...
URL: http://python.cn/pipermail/python-chinese/attachments/20061106/b13affe4/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 21:36

苏亚 su1981ya在163.com
星期一 十一月 6 21:36:15 HKT 2006

Yung-Yu Chen 写道:
> from numpy import fromstring
>
> strdata = open( "file.txt" ).read()
> st = strdata.find( '{' )
> en = strdata[st:].find( '}' )
> data = fromstring( strdata[st:st+en], dtype=float, sep=' ' )
>
> 這樣寫會比 map( float, strdata.split() ) 快很多喔。
> 當然,numpy 是另外裝的。
>
> On 11/6/06, *苏亚* <su1981ya在163.com su1981ya在163.com>> wrote:
>
>     Yunfeng Tao 写道:
>     > float()
>     >
>     > 2006/11/6, 苏亚 <su1981ya在163.com su1981ya在163.com>>:
>     >
>     >> 我有个数据文件,内容为
>     >> version: 1
>     >> n_points: 43
>     >> {
>     >> 64.2019 138.498
>     >> 75.5079 192.606
>     >> 109.022 226.927
>     >> 130.019 231.773
>     >> 147.785 225.312
>     >> 179.281 192.606
>
这个方法真不错,试试!


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 22:02

david tdavid77在tom.com
星期一 十一月 6 22:02:39 HKT 2006

limodou 写道:
>> 请问应该怎么处理?
> 
> 如果你要的就是内部的浮点数,根本不需要处理,精度只有在输出为字符串的时候才需要处理。
> 

我用的是IDLE,简单试了几个例子
 输入: float('123.6666789')
输出:123.66667889999999
输入:float('123.116666789')
输出:123.11666678900001
发现这种转换可能会出问题,所以想提醒一下,至于怎么处理我是不知道了,还望 
高手解答。也许用float()直接转换并不是好的方法。


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 22:05

limodou limodou在gmail.com
星期一 十一月 6 22:05:54 HKT 2006

On 11/6/06, david <tdavid77在tom.com> wrote:
> limodou 写道:
> >> 请问应该怎么处理?
> >
> > 如果你要的就是内部的浮点数,根本不需要处理,精度只有在输出为字符串的时候才需要处理。
> >
>
> 我用的是IDLE,简单试了几个例子
>  输入: float('123.6666789')
> 输出:123.66667889999999
> 输入:float('123.116666789')
> 输出:123.11666678900001
> 发现这种转换可能会出问题,所以想提醒一下,至于怎么处理我是不知道了,还望
> 高手解答。也许用float()直接转换并不是好的方法。
>
有什么问题,一般判断浮点数是否相同都是保证在一个精度内就可以了,而不是绝对的相等。如差的绝对值小于0.01之类的就行了。


-- 
I like python!
UliPad <>: http://wiki.woodpecker.org.cn/moin/UliPad
My Blog: http://www.donews.net/limodou

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 22:22

david tdavid77在tom.com
星期一 十一月 6 22:22:00 HKT 2006

limodou 写道:
>> 请问应该怎么处理?
> 
> 如果你要的就是内部的浮点数,根本不需要处理,精度只有在输出为字符串的时候才需要处理。
> 
刚才又试了一下,为什么用print输出以后又不存在这种问题了,显示的结果与字 
条串完全一样,奇怪。


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 22:29

Leo Jay python.leojay在gmail.com
星期一 十一月 6 22:29:41 HKT 2006

On 11/6/06, david <tdavid77在tom.com> wrote:
>
> limodou дµÀ:
> >> ÇëÎÊÓ¦¸ÃÔõô´¦Àí?
> >
> > Èç¹ûÄãÒªµÄ¾ÍÊÇÄÚ²¿µÄ¸¡µãÊý£¬¸ù±¾²»ÐèÒª´¦Àí£¬¾«¶ÈÖ»ÓÐÔÚÊä³öΪ×Ö·û´®µÄʱºò²ÅÐèÒª´¦Àí¡£
> >
> ¸Õ²ÅÓÖÊÔÁËһϣ¬ÎªÊ²Ã´ÓÃprintÊä³öÒÔºóÓÖ²»´æÔÚÕâÖÖÎÊÌâÁË£¬ÏÔʾµÄ½á¹ûÓë×Ö
> Ìõ´®ÍêÈ«Ò»Ñù£¬Ææ¹Ö¡£
>

ËÑÒ»ÏÂ֮ǰµÄÌû×Ó°É¡£Õâ¸öÎÊÌâÎÒ֮ǰ»Ø´ð¹ýµÄ¡£
http://python.cn/pipermail/python-chinese/2006-July/027875.html
http://python.cn/pipermail/python-chinese/2006-July/027877.html
http://python.cn/pipermail/python-chinese/2006-July/027878.html




-- 
Best Regards,
Leo Jay
-------------- 下一部分 --------------
Ò»¸öHTML¸½¼þ±»ÒƳý...
URL: http://python.cn/pipermail/python-chinese/attachments/20061106/8b6d97d0/attachment-0001.html 

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月06日 星期一 22:35

lu lubiao.py在gmail.com
星期一 十一月 6 22:35:34 HKT 2006

> 刚才又试了一下,为什么用print输出以后又不存在这种问题了,显示的结果与字
> 条串完全一样,奇怪。

实属巧合
>>> a =  float('123.678987654321')
>>> a
123.67898765432101
>>> print a
123.678987654

print 貌似保留有限位。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月07日 星期二 09:12

唐国巍 tdavid77在tom.com
星期二 十一月 7 09:12:48 HKT 2006

Leo Jay 写道:
> On 11/6/06, *david* <tdavid77在tom.com tdavid77在tom.com>> wrote:
> 
>     limodou 写道:
>      >> 请问应该怎么处理?
>      >
>      > 如果你要的就是内部的浮点数,根本不需要处理,精度只有在输出为字符
>     串的时候才需要处理。
>      >
>     刚才又试了一下,为什么用print输出以后又不存在这种问题了,显示的结果与字
>     条串完全一样,奇怪。
> 
>  
> 搜一下之前的帖子吧。这个问题我之前回答过的。
> http://python.cn/pipermail/python-chinese/2006-July/027875.html
> http://python.cn/pipermail/python-chinese/2006-July/027877.html
> http://python.cn/pipermail/python-chinese/2006-July/027878.html
>  
> 
> 
> 
> -- 
> Best Regards,
> Leo Jay
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
讲得很详细,看来要多读源码,这是开源的优势。


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年11月07日 星期二 09:56

Yunfeng Tao taoyfeng在gmail.com
星期二 十一月 7 09:56:03 HKT 2006

2006/11/6, david <tdavid77在tom.com>:
> 我用的是IDLE,简单试了几个例子
>  输入: float('123.6666789')
> 输出:123.66667889999999
> 输入:float('123.116666789')
> 输出:123.11666678900001
> 发现这种转换可能会出问题,所以想提醒一下,至于怎么处理我是不知道了,还望
> 高手解答。也许用float()直接转换并不是好的方法。

一个有限位十进制小数,其等值的二进制小数可能是个无限循环小数。电脑里存二进制数,再截一下尾,得到的数当然可能和原来的十进制数有些出入。具体到出入有多大,可以去查一下IEEE关于双精度浮点数的格式定义。

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号