本文将介绍Golang将float64转换为int错误的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Dask:不能安全地将非等效的float64
本文将介绍Golang将float64转换为int错误的详细情况,。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Dask:不能安全地将非等效的 float64 转换为 int64,但只有 object 和 int64 列、Go,Golang,formatFloat:将float数字转换成string、golang interface 转 string,int,float64、golang string int int32 int64 float32 float64 time 互相转换的知识。
本文目录一览:- Golang将float64转换为int错误
- Dask:不能安全地将非等效的 float64 转换为 int64,但只有 object 和 int64 列
- Go,Golang,formatFloat:将float数字转换成string
- golang interface 转 string,int,float64
- golang string int int32 int64 float32 float64 time 互相转换
Golang将float64转换为int错误
将float转换为int时如何避免浮点错误。例如,下面的代码打印出来:0.5499999999999972
当我受伤时,期望它打印出来0.55
。
package mainimport "fmt"func main() { x := 100.55 fmt.Println(x - float64(int(x))) }Output:0.5499999999999972
答案1
小编典典您需要了解一些内容:100.55
是一个十进制数字(以十进制基数表示)。100.55
十进制中的是一个有限数字,正好是:100.55
。
通常,计算机以二进制表示形式存储数字。该数字100.55
不能用有限的二进制数表示:100.55
是以二进制表示的 无限
数(同样的原因为什么1/3
不能用有限的十进制数表示,它是一个无穷的序列:)0.333333333....
。
但是Go(像其他语言一样)float64
使用IEEE-754标准存储类型,IEEE-754标准是一种有限的
二进制 表示形式。甲float64
值使用64个比特在存储器来描述的53位被用于描述数字和11位被用于指数的数量,。
现在,当您“说”这一点时:
x := 100.55
这是一个简短的变量声明,它将创建一个名为的新变量,x
并从右侧表达式(其为浮点文字)推断类型,因此Go
spec x
的类型为float64
。为了使用64位(由所指定的规则IEEE-754
)表示,浮点字面量必须进行“转换”
。并且由于100.55
将要求无限位以二进制基数精确地表示,因此仅使用64位(数字为53)将不会(不能)准确100.55
(而是最接近IEEE-754格式的64位二进制数)
),即:
x := 100.55fmt.Printf("%.50f\n", x)100.54999999999999715782905695959925651550292968750000
因此,您已经开始没有数字了100.55
。
您100
从中减去(float64(int(x))
将完全是100.0
):
x = x - float64(int(x))fmt.Printf("%.50f\n", x)0.54999999999999715782905695959925651550292968750000
你能为这个做什么?真的没什么。您期望的结果(0.55
)也是二进制表示形式的无限数,因此0.55
类型type的变量中不能有确切的数目float64
。
您可以正常使用数字,但是在打印时,将其四舍五入到您选择的小数位。最简单的方法是使用fmt.Printf()
,并使用%f
包括精度的动词指定格式字符串:
fmt.Printf("%.2f\n", x)
结果:
0.55
另一种选择是避免使用浮点数。例如,如果要表示美元金额,则可以将所有值“乘以”,100
并将金额表示为美分(1 $ *100),这是整数。仅当您需要将结果打印为美元时,才可以打印类似
cents := 10055fmt.Printf("%d.%d $", cents/100, cents%100)
输出:
100.55 $
Dask:不能安全地将非等效的 float64 转换为 int64,但只有 object 和 int64 列
如何解决Dask:不能安全地将非等效的 float64 转换为 int64,但只有 object 和 int64 列?
我尝试阅读和处理 60 列 (150MB) 的 CSV 文件:
df = dataframe.read_csv(
path,**dialect,dtype=dtype,encoding=encoding,storage_options=storage_options,)
但是当我尝试 len(df)
时,它会引发 TypeError: cannot safely cast non-equivalent float64 to int64
但是,在 dtype
中,我只为我的列定义指定了 Int64
和 object
类型。
这个浮点转换从何而来?
编辑:经过调查,问题与定义为 int 的列有关,其中包含(在 CSV 中很远)一些字符串值。错误显然不明确
编辑:堆栈跟踪
Traceback (most recent call last):
File "/home/benjamin/try/try-back/apps/data/tasks.py",line 168,in csv_to_parquet_task
df.to_parquet(
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/dataframe/core.py",line 3974,in to_parquet
return to_parquet(self,path,*args,**kwargs)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/dataframe/io/parquet/core.py",line 508,in to_parquet
out = out.compute(**compute_kwargs)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/base.py",line 167,in compute
(result,) = compute(self,traverse=False,**kwargs)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/base.py",line 452,in compute
results = schedule(dsk,keys,**kwargs)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/threaded.py",line 76,in get
results = get_async(
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/local.py",line 486,in get_async
raise_exception(exc,tb)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/local.py",line 316,in reraise
raise exc
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/local.py",line 222,in execute_task
result = _execute_task(task,data)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/core.py",line 121,in _execute_task
return func(*(_execute_task(a,cache) for a in args))
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/core.py",in <genexpr>
return func(*(_execute_task(a,cache) for a in args))
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/dask/dataframe/io/csv.py",line 150,in pandas_read_text
df = reader(bio,**kwargs)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/io/parsers.py",line 688,in read_csv
return _read(filepath_or_buffer,kwds)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/io/parsers.py",line 460,in _read
data = parser.read(nrows)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/io/parsers.py",line 1198,in read
ret = self._engine.read(nrows)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/io/parsers.py",line 2157,in read
data = self._reader.read(nrows)
File "pandas/_libs/parsers.pyx",line 847,in pandas._libs.parsers.TextReader.read
File "pandas/_libs/parsers.pyx",line 862,in pandas._libs.parsers.TextReader._read_low_memory
File "pandas/_libs/parsers.pyx",line 941,in pandas._libs.parsers.TextReader._read_rows
File "pandas/_libs/parsers.pyx",line 1073,in pandas._libs.parsers.TextReader._convert_column_data
File "pandas/_libs/parsers.pyx",line 1104,in pandas._libs.parsers.TextReader._convert_tokens
File "pandas/_libs/parsers.pyx",line 1182,in pandas._libs.parsers.TextReader._convert_with_dtype
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/core/arrays/integer.py",line 385,in _from_sequence_of_strings
return cls._from_sequence(scalars,dtype,copy)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/core/arrays/integer.py",line 378,in _from_sequence
return integer_array(scalars,copy=copy)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/core/arrays/integer.py",line 160,in integer_array
values,mask = coerce_to_array(values,line 275,in coerce_to_array
values = safe_cast(values,copy=False)
File "/home/benjamin/.cache/pypoetry/virtualenvs/try-dKznE2K2-py3.8/lib/python3.8/site-packages/pandas/core/arrays/integer.py",line 179,in safe_cast
raise TypeError(
TypeError: cannot safely cast non-equivalent float64 to int64
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Go,Golang,formatFloat:将float数字转换成string
http://golang.org/pkg/strconv/
http://play.golang.org/p/4VNRgW8WoB
如何将浮点数转换为字符串格式?
这是谷歌操场,但没有得到预期的输出. (2e 07)
我想得到“21312421.213123”
package main import "fmt" import "strconv" func floattostr(input_num float64) string { // to convert a float number to a string return strconv.FormatFloat(input_num,'g',1,64) } func main() { fmt.Println(floattostr(21312421.213123)) // what I expect is "21312421.213123" in string format }
请帮我把字符串从浮点数中取出.谢谢
package main import "fmt" import "strconv" func FloatToString(input_num float64) string { // to convert a float number to a string return strconv.FormatFloat(input_num,'f',6,64) } func main() { fmt.Println(FloatToString(21312421.213123)) }
如果你只想要尽可能多的数位精度,那么特殊的精度-1使用最小的数字位数,使得ParseFloat将精确地返回f.例如
strconv.FormatFloat(input_num,-1,64)
我个人觉得fmt更容易使用. (Playground link)
fmt.Printf("x = %.6f\n",21312421.213123)
或者如果你只是想转换字符串
fmt.Sprintf("%.6f",21312421.213123)
golang interface 转 string,int,float64
inter 是interface类型,转化为string类型是:
str := inter.(string)
转为其他类型也类似
testInt := inter.(int)
testFloat := inter.(float64)
示例如下:
func interface2String(inter interface{}) {
switch inter.(type) {
case string:
fmt.Println("string",inter.(string))
break
case int:
fmt.Println("int",inter.(int))
break
case float64:
fmt.Println("float64",inter.(float64))
break
}
}
func main() {
interface2String("jack")
interface2String(1)
interface2String(12.223)
}
输出结果:
string jack
int 1
float64 12.223
golang string int int32 int64 float32 float64 time 互相转换
目录
1.float64转int int转int64
2.string和int、int32、int64
3.string和float32、float64
4.string和time
5.转换函数说明
ParseInt函数的官方介绍
ParseFloat函数的官方介绍
FormatFloat函数的官方介绍
1.float64转int int转int64
// float64转int
var a float64
a = 3.1
b := int(a)
// int转int64
var a int
a = 1
b := int64(a)
2.string和int、int32、int64
i,_ := strconv.Atoi(s) //string转int
s := strconv.Itoa(i) //int转string
//等价于
string := strconv.FormatInt(int64(int),10)
i,_ := strconv.ParseInt(s,10,32) //string转int32
ii := int32(i)
i,64) //string转int32
s := strconv.FormatInt(i,10) //int64转string
//第二个参数为基数,可选2~36
//对于无符号整形,可以使用FormatUint(i uint64,base int)
int64,err := strconv.ParseInt(string,64) //string到int64
//第二个参数为基数(2~36),
//第三个参数位大小表示期望转换的结果类型,其值可以为0,8,16,32和64,
//分别对应 int,int8,int16,int32和int64
3.string和float32、float64
f,_ := strconv.ParseFloat(s,32) //string转float32
ff := float32(f)
f,64) //string转float64
s := strconv.FormatFloat(f,'f',-1,64) //float64转string
// float到string
string := strconv.FormatFloat(float32,'E',32)
string := strconv.FormatFloat(float64,64)
// 'b' (-ddddp±ddd,二进制指数)
// 'e' (-d.dddde±dd,十进制指数)
// 'E' (-d.ddddE±dd,十进制指数)
// 'f' (-ddd.dddd,没有指数)
// 'g' ('e':大指数,'f':其它情况)
// 'G' ('E':大指数,'f':其它情况)
4.string和time
t,_ := time.Parse("2006-01-02 15:04:05",s) //string转时间
t,_ := time.ParseInLocation("2006-01-02 15:04:05",s,time.Local) //string转本地时间
s := t.Format("2006-01-02 15:04:05") //时间转string
5.转换函数说明
ParseInt函数的官方介绍
func ParseInt(s string,base int,bitSize int) (i int64,err error)
--返回字符串表示的整数值,接受正负号。
--base指定进制(2到36),如果base为0,则会从字符串前置判断,"0x"是16进制,"0"是8进制,否则是10进制。
--bitSize指定结果必须能无溢出赋值的整数类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64。
--返回的err是*NumErr类型的,如果语法有误,err.Error = ErrSyntax;如果结果超出类型范围err.Error = ErrRange。
FormatInt函数中的10,表示10进制。
ParseFloat函数的官方介绍
func ParseFloat(s string,bitSize int) (f float64,err error)
--解析一个表示浮点数的字符串并返回其值。
--如果s合乎语法规则,函数会返回最为接近s表示值的一个浮点数(使用IEEE754规范舍入)。
--bitSize指定了期望的接收类型,32是float32(返回值可以不改变精确值的赋值给float32),64是float64。
--返回值err是*NumErr类型的,语法有误的,err.Error=ErrSyntax;结果超出表示范围的,返回值f为±Inf,err.Error= ErrRange。
FormatFloat函数的官方介绍
func FormatFloat(f float64,fmt byte,prec,bitSize int) string
--bitSize表示f的来源类型(32:float32、64:float64),会据此进行舍入。
--fmt表示格式:'f'(-ddd.dddd)、'b'(-ddddp±ddd,指数为二进制)、'e'(-d.dddde±dd,十进制指数)、'E'(-d.ddddE±dd,十进制指数)、'g'(指数很大时用'e'格式,否则'f'格式)、'G'(指数很大时用'E'格式,否则'f'格式)。
--prec控制精度(排除指数部分):对'f'、'e'、'E',它表示小数点后的数字个数;对'g'、'G',它控制总的数字个数。如果prec 为-1,则代表使用最少数量的、但又必需的数字来表示f。
关于Golang将float64转换为int错误的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Dask:不能安全地将非等效的 float64 转换为 int64,但只有 object 和 int64 列、Go,Golang,formatFloat:将float数字转换成string、golang interface 转 string,int,float64、golang string int int32 int64 float32 float64 time 互相转换的相关信息,请在本站寻找。
本文标签: