GVKun编程网logo

澄清Python中的小数类型(python isdigit 小数)

21

以上就是给各位分享澄清Python中的小数类型,其中也会对pythonisdigit小数进行解释,同时本文还将给你拓展c语言中的小数类型有哪些、MOOCpython笔记(二)python中的数据类型和

以上就是给各位分享澄清Python中的小数类型,其中也会对python isdigit 小数进行解释,同时本文还将给你拓展c语言中的小数类型有哪些、MOOC python笔记(二)python中的数据类型和基本语句、MySQL 将字符串类型的小数转换为保留位数的小数类型、Python 函数中的参数类型等相关知识,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

澄清Python中的小数类型(python isdigit 小数)

澄清Python中的小数类型(python isdigit 小数)

每个人都知道,或者至少每个程序员都应该知道,使用该float类型可能会导致精度错误。但是,在某些情况下,精确的解决方案将是不错的选择,并且在某些情况下,使用epsilon值进行比较是不够的。无论如何,这不是重点。

我知道DecimalPython中的类型,但从未尝试使用它。它指出“十进制数可以精确表示”,我认为这意味着可以实现任何实数的聪明实现。我的第一次尝试是:

>>> from decimal import Decimal>>> d = Decimal(1) / Decimal(3)>>> d3 = d * Decimal(3)>>> d3 < Decimal(1)True

非常令人失望,我回到文档中并继续阅读:

算术上下文是一个指定精度的环境[…]

好的,所以实际上有精度。可以复制经典问题:

>>> dd = d * 10**20>>> ddDecimal(''33333333333333333333.33333333'')>>> for i in range(10000):...    dd += 1 / Decimal(10**10)>>> ddDecimal(''33333333333333333333.33333333'')

所以, 我的问题是: 有没有办法让精度无限的小数类型?如果不是,比较2个十进制数字的更优雅的方法是什么(例如,如果增量小于精度,则d3
<1应该返回False)。

当前,当我只进行除法和乘法运算时,我使用以下Fraction类型:

>>> from fractions import Fraction>>> f = Fraction(1) / Fraction(3)>>> fFraction(1, 3)>>> f * 3 < 1False>>> f * 3 == 1True

这是最好的方法吗?还有其他选择吗?

答案1

小编典典

Decimal类最适合于财务类型加法,减法乘法,除法类型问题:

>>> (1.1+2.2-3.3)*100000000000000000004440.892098500626                            # relevant for government invoices...>>> import decimal>>> D=decimal.Decimal>>> (D(''1.1'')+D(''2.2'')-D(''3.3''))*10000000000000000000Decimal(''0.0'')

分数模块与您描述的有理数问题域配合良好:

>>> from fractions import Fraction>>> f = Fraction(1) / Fraction(3)>>> fFraction(1, 3)>>> f * 3 < 1False>>> f * 3 == 1True

对于用于科学工作的纯多精度浮点,请考虑使用mpmath。

如果您的问题可以解决符号问题,请考虑sympy。这是您处理1/3问题的方法:

>>> sympy.sympify(''1/3'')*31>>> (sympy.sympify(''1/3'')*3) == 1True

Sympy将mpmath用于任意精度的浮点,包括以符号方式处理有理数和无理数的能力。

考虑无理值√2的纯浮点表示形式:

>>> math.sqrt(2)1.4142135623730951>>> math.sqrt(2)*math.sqrt(2)2.0000000000000004>>> math.sqrt(2)*math.sqrt(2)==2False

与sympy比较:

>>> sympy.sqrt(2)sqrt(2)                              # treated symbolically>>> sympy.sqrt(2)*sympy.sqrt(2)==2True

您还可以减少值:

>>> import sympy>>> sympy.sqrt(8)2*sqrt(2)                            # √8 == √(4 x 2) == 2*√2...

但是,如果不小心,您会看到Sympy的问题类似于直线浮点:

>>> 1.1+2.2-3.34.440892098500626e-16>>> sympy.sympify(''1.1+2.2-3.3'')4.44089209850063e-16                   # :-(

最好用Decimal完成:

>>> D(''1.1'')+D(''2.2'')-D(''3.3'')Decimal(''0.0'')

或使用小数或Sympy并保留诸如1.1比率之类的值:

>>> sympy.sympify(''11/10+22/10-33/10'')==0True>>> Fraction(''1.1'')+Fraction(''2.2'')-Fraction(''3.3'')==0True

或在sympy中使用Rational:

>>> frac=sympy.Rational>>> frac(''1.1'')+frac(''2.2'')-frac(''3.3'')==0True>>> frac(''1/3'')*31

您可以和sympy
live一起玩。

c语言中的小数类型有哪些

c语言中的小数类型有哪些

c 语言小数类型有:float:单精度浮点数,精度 7 位,占用 32 位内存。double:双精度浮点数,精度 15 位,占用 64 位内存。选择类型依据精度需求,精度低用 float,高用 double。浮点数可隐式转换但丢失精度,极大或极小数字可用科学计数法表示。

c语言中的小数类型有哪些

C 语言中的小数类型

C 语言中提供两种小数类型,分别为:

  • float:单精度浮点数,占用 32 位内存空间,可表示约 7 位有效数字。
  • double:双精度浮点数,占用 64 位内存空间,可表示约 15 位有效数字。

选择类型

选择哪种小数类型取决于所需精度和内存消耗。对于要求较低精度的计算,float 类型就足够了。但对于需要更高精度的高要求计算,建议使用 double 类型。

立即学习“C语言免费学习笔记(深入)”;

精度比较

下表比较了下列值为不同类型时的精度:

float double
0.123 0.123000 0.12300000000000000
12345.6789 12345.679 12345.67890625

内存消耗

float 类型占用 32 位内存空间,而 double 类型占用 64 位内存空间。因此,在需要处理大量小数数据且内存有限的情况下,选择 float 类型可以节省内存。

注意事项

  • 小数类型可以隐式转换,例如 float 变量可以赋值给 double 变量,但是相反的转换则会丢失精度。
  • 对于极大或极小的数字,可以使用科学计数法表示,例如 1.23e-10 表示 1.23 * 10^(-10)。

以上就是c语言中的小数类型有哪些的详细内容,更多请关注php中文网其它相关文章!

MOOC python笔记(二)python中的数据类型和基本语句

MOOC python笔记(二)python中的数据类型和基本语句

#python数据类型 ##数字类型 ###整数(int) 与数学中整数概念一致(数字大小没有限制,这和其他语言不同),整数可正可负,默认情况下,整数采用十进制。其他进制需要增加相应的引导符号。
如果是二进制在前面加上0b或者0B即可,如果是八进制在前面加上0o或者0O即可,如果是十六进制在前面加上0x或者0X即可。
###浮点数(float) 与数学中的实数概念一致,取值范围与精度都有限制。
表达方式:
1.小数:1.23,3.14,-9.01
2.科学计数法:1.23e9,1.2e-5
浮点数运算存在不确定位数,有误差,这是由于计算机用二进制存储浮点数造成的。
如果要消除位数可以使用round函数。
该函数原型为:round(number,ndigit=none)
###复数(complex) 与数学中的复数概念一致。
由实部和虚部组成,虚部用j表示。
例如:2+3j,2为实部,3j为虚部。
real方法取实部,imag方法取虚部。
complex(real,imag)函数可以用于创建一个职位real+imag*j的复数。
###与数字有关的运算符
python只支持加减乘除和幂运算。 与其他语言不同的是,python的整数除法与浮点数除法是分开的。其中:
/为浮点数除法,结果为小数。
//为整数除法,结果为整数,向下(左)取余。
另外python提供了幂运算,符号为**,它的优先级高于乘除和加减。
python不支持自增自减。 注意python中的--i与++i不是自增自减操作,详见:python开发_++i,i += 1的区分 ###数学库(math) e 自然常数
pi 圆周率
log(x[,base=e]) 返回以base为底的对数,缺省为e
pow(x,y) 返回x的y次方
sqrt(x) 返回x的平方根
fabs(x) 返回x的绝对值
round(x[,n]) 返回浮点数x的四舍五入值,n代表舍入到小数点后的位数
divmod(x,y) 返回x和y的商和余数
##字符串类型 python中没有字符类型,即使是一个字符也是字符串。
字符串是以引号括起来的任意文本,是一个有序序列
表示形式:
单引号:''abc''
双引号:"hello"
三引号:"''hello
world''"
关于这些引号的用法详见:Python中单引号,双引号,3个单引号及3个双引号的区别
转义字符:和C/C++基本一致 ###字符串运算符 +连接字符串 >>>''hello''+''world''
''helloworld''
* 复制字符串 >>>''ab''*3
''ababab''
###字符串切片
字符串是一个有序序列,可以是正向递增,也可以是反向递减。
索引:在[]中给出序号
切片:在[]中给出切片序号
例如:

>>> a=''abcdefgh''
>>> a[0]
''a''
>>> a[-8]
''a''
>>> a[1]
''b''
>>> a[1:5]
''bcde''

##布尔值与关系、逻辑运算 python中提供布尔值:True、False(注意首字母大写)。
逻辑运算和关系运算的结果是布尔值。
注意python3中不同类型的数据不可以在一起比较。
另外python中支持连续的关系运算,如: >>>1<3<5 #等价于1<3 and 3<5
另外与C/C++中不同的是,逻辑运算符,与或非为and,or,not而非&&、||、!
另外按位与,或,异或,翻转python是支持的。
1.与运算:A与B值均为1时,A、B与的运算结果才为1,否则为0 (运算符:&)
2.或运算:A或B值为1时,A、B或的运算结果才为1,否则为0 (运算符:|)
3.异或运算:A与B不同为1时,A、B的预算结果才为1,否则为0 (运算符:^)
4.按位翻转(按位取反):将内存中表示数字的2进制数取反0取1,1取0 (运算符:~)
运算符优先级与C/C++一致。
##内置转换函数 内置函数指不需要导入类的函数 如图:
_M0N_V1RW_0MG08MO`T3_YP.png
类型转换函数实例:
基本格式:int(x[,base])

>>> int() #不传入参数时,得到结果0.
0
>>> int("02") #去掉0
2
>>> int("   35    ") #去掉空格
35
>>> int("35",8) #八进制
29

#python中的语句 python语句包括赋值语句,分支语句,循环语句等。
语句通常是一行一条,如果需要一行多条的话需要在语句末尾加分号。
如果一条语句过长我们也可以使用续行符来\跨行表示。
需要注意的是,python中的语句是严格注意缩进的!(我觉得这是为了C/C++中的悬空else问题)。
##赋值语句 基本形式是“变量=值”的形式。

>>> x=1
>>> y=2
>>> k=x+y
>>> x
1
>>> y
2
>>> k
3

也可以进行序列赋值

>>> x,y=4,8
>>> x
4
>>> y
8
>>> a,b="34"
>>> a
''3''
>>> b
''4''

注意序列赋值时,两边序列容器中的元素个数必须一致否则会报错。

>>> i,j=[1,2,3]
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    i,j=[1,2,3]
ValueError: too many values to unpack (expected 2)

小技巧:在python中可以使用序列赋值来进行swap

>>> a=4;b=8
>>> a,b=b,a
>>> a
8
>>> b
4

还可以进行多变量赋值(即连等)

>>> a=b=c=5
>>> print(a,b,c)
5 5 5

##分支语句

if 逻辑表达式:
	语句块1
else:
	语句块2  

这个没啥好说的。
##循环语句

while语句

while(BOOL):
    语句块

while语句可以使用break退出,continue重新开始。 例如

while(True):
    x=int(input())
    if(x!=-1):
        sum+=x
    elif(x==0):
        continue
    else:
        break

for语句

for variable in 序列:
	语句块

例如:

>>> s="hello,world"
>>> for i in s:
	print(i,end='''')	
hello,world

有时为了方便产生序列我们引入range函数

range函数

range(start,stop,step)
start:计数从start开始。默认是从0开始。
例如range(5)等价于range(0,5) stop:计数到stop结束,但不包括stop。
例如:list(range(0,5))是[0,1,2,3,4]没有5
step:步长,默认为1。
例如:range(0,5)等价于range(0,5,1)
注意range的返回值并不为序列,而是iterable,(具体是什么我暂时也不是很清楚,只知道可以在for循环中迭代使用,其他情况下只有变成列表才管用),需要用list()强制转换。

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(1,10,4))
[1, 5, 9]
>>> list(range(0,-10,-1))
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

循环中的else语句

python中提供了判断程序是用break跳出还是正常退出的语句。
如果程序正常退出则执行else。
break,return退出循环,则不执行else语句。

x=int(input())
for i in range(1,10):
    if(i>x):
        break
else:
    print("x>9")

异常处理语句

try:
    语句块1
except 异常类型1:
    语句块2
except 异常类型2:
....
except:
    语句块3
else:
    语句块4
finally:
    语句块5

如果try里的语句块发生了异常就根据异常执行相应except中的语句。
如果except后面没有异常类型则包含所有异常类型。
如果没有异常就执行else。
无论有没有异常都指向finally。
###异常类型 异常名称|描述 --|-- BaseException|所有异常的基类 SystemExit|解释器请求退出 KeyboardInterrupt|用户中断执行(通常是输入^C) Exception|常规错误的基类 StopIteration|迭代器没有更多的值 GeneratorExit|生成器(generator)发生异常来通知退出 StandardError|所有的内建标准异常的基类 ArithmeticError|所有数值计算错误的基类 FloatingPointError|浮点计算错误 OverflowError|数值运算超出最大限制 ZeroDivisionError|除(或取模)零 (所有数据类型) AssertionError|断言语句失败 AttributeError|对象没有这个属性 EOFError|没有内建输入,到达EOF 标记 EnvironmentError|操作系统错误的基类 IOError|输入/输出操作失败 OSError|操作系统错误 WindowsError|系统调用失败 ImportError|导入模块/对象失败 LookupError|无效数据查询的基类 IndexError|序列中没有此索引(index) KeyError|映射中没有这个键 MemoryError|内存溢出错误(对于Python 解释器不是致命的) NameError|未声明/初始化对象 (没有属性) UnboundLocalError|访问未初始化的本地变量 ReferenceError|弱引用(Weak reference)试图访问已经垃圾回收了的对象 RuntimeError|一般的运行时错误 NotImplementedError|尚未实现的方法 SyntaxError|Python 语法错误 IndentationError|缩进错误 TabError|Tab 和空格混用 SystemError|一般的解释器系统错误 TypeError|对类型无效的操作 ValueError|传入无效的参数 UnicodeError|Unicode 相关的错误 UnicodeDecodeError|Unicode 解码时的错误 UnicodeEncodeError|Unicode 编码时错误 UnicodeTranslateError|Unicode 转换时错误 Warning|警告的基类 DeprecationWarning|关于被弃用的特征的警告 FutureWarning|关于构造将来语义会有改变的警告 OverflowWarning|旧的关于自动提升为长整型(long)的警告 PendingDeprecationWarning|关于特性将会被废弃的警告 RuntimeWarning|可疑的运行时行为(runtime behavior)的警告 SyntaxWarning|可疑的语法的警告 UserWarning|用户代码生成的警告

格式化输出

format函数

基本格式:str.format()

>>> x=3.14159
>>> y=2*x*3
>>> print("{0:.2f} {1:.2f}".format(x,y))
3.14 18.85

0和1表示format函数中的第一和第二个参数
.2f表示小数部分保留两位,四舍五入。
格式化的方法与C/C++一致。
除了format函数实际上还有一种方式%可以将字符串格式化,用法基本与这个一致,下节会提一下。

MySQL 将字符串类型的小数转换为保留位数的小数类型

MySQL 将字符串类型的小数转换为保留位数的小数类型

MySQL 将字符串类型的小数转换为保留位数的小数类型


问题背景

在实际开发中,可能数据在流转或者传递环节中,需要对数值类型做转换(比如:将varchar类型的"3.14",转为浮点类型的3.14)

如何使用SQL语句实现此种场景的数据转换呢?

 

解决方案

数据转换可以用到MySQL自带的函数 cast()或者convert(),浮点类型可以使用decimal()函数。

示例如下:

1)不保留小数的情况

select cast("3.14159" as decimal);        # 运行结果:3
select convert("3.14159", decimal);       # 运行结果:3

 

2)保留小数的情况

select cast("3.14159" as decimal(10, 2));  # 运行结果:3.14
select convert("3.14159", decimal(10, 2)); # 运行结果:3.14

select cast("3.14159" as decimal(10, 3));  # 运行结果:3.142
select convert("3.14159", decimal(10, 3)); # 运行结果:3.142

select cast("3.14159" as decimal(10, 4));  # 运行结果:3.1416
select convert("3.14159", decimal(10, 4)); # 运行结果:3.1416

select cast("3.14159" as decimal(10, 5));  # 运行结果:3.14159
select convert("3.14159", decimal(10, 5)); # 运行结果:3.14159

 

补充说明

demical(M,D)函数采取四舍五入的方式,保留小数位数。

M:浮点型数值的总位数;

D:浮点型数值的小数保留位数。

 

Python 函数中的参数类型

Python 函数中的参数类型

1.前言

Python 中函数的参数类型比较丰富,比如我们经常见到 *args**kwargs 作为参数。初学者遇到这个多少都有点懵逼,今天我们来把 Python 中的函数参数进行分析和总结。

2.Python 中的函数参数

在 Python 中定义函数参数有 5 种类型,我们来一一演示它们。

2.1 必选参数

必须参数是最基本的参数类型,当你在 Python 函数中定义一个必选参数时,每次调用都必须给予赋值,否则将报错。

>>>def fun(a):
print("a=",a)

>>>fun(''felord.cn'')
a= felord.cn
>>>fun()
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: fun() missing 1 required positional argument: ''a''

2.2 默认参数

默认参数就是拥有一个默认值的参数。

>>>def fun(a="felord.cn"):
print("a=",a)

>>>fun()
a= felord.cn
>>>fun("Felordcn")
a= Felordcn

我们来看看下面这种情况:

>>>def fun(a=[]):
a.append("foo")
print("a=",a)

>>>fun()
a= [''foo'']
>>>fun()
a= [''foo'', ''foo'']
>>>fun()
a= [''foo'', ''foo'', ''foo'']

这是什么情况?每次调用参数 a 都“记忆”了原来的值,这是因为 Python 函数在定义的时候,默认参数a的值就被初始化为[],其实a也是一个变量,它指向对象[],每次调用该函数改变 a的值则会改变 a指针指向的对象的值。当你将 a的默认值定义为一个不可变对象时就不会发生这种情况,你可以试试我说的。

所以,定义默认参数要牢记一点:默认参数必须指向不变对象!

2.3 可变参数

有很多场景我们不确定参数的个数,也就是说参数是可变的。首先你可能会想到使用 list 或者 tuple (元组)来封装多个参数,但是如何才能从函数的语义上看出这是一个可变参数呢?所以我们通过一个前缀标识 * 来声明该参数是一个可变参数,通常记作 *args ,你也可以记作 *paramsargs 会把所有的参数收纳成一个 tuple。我们来演示一个求和的函数:

>>>def calc(*args):
total=0
for i in args:
total+=i
return total

>>>calc(1)
1
>>>calc(1,2,3,4,5)
15
>>>calc()
0

2.4 关键字参数

关键字参数也是实现任意个数参数的一种方式,区别在于可变参数收纳为一个 tuple 而关键字参数将我们传入参数的参数名和对应的值收纳为一个dict (字典)。通常记作 **kwargs 以区别于可变参数,实际上 kw 就是 keyword的缩写。我们来试一试:

>>>def mapper(**kwargs):
print(kwargs)

>>>mapper()
{}
>>>mapper(name="felord.cn")
{''name'': ''felord.cn''}

2.5 命名关键字参数

对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些关键字,需要我们在函数内部进行显式的检查来确定,这种样板代码往往跟我们的意图无关。那么 Python 本身能不能限制关键字参数的名字呢?当然有!我们可以使用命名关键字参数来实现这个目的。在 *, 之后紧跟的连续的非可变参数和非关键字参数就是命名关键字参数。我们也来演示一下:

>>>def info(name,*,age,city):
print("name=",name,"age=",age,"city=",city)

>>>info("felord.cn")
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: info() missing 2 required keyword-only arguments: ''age'' and ''city''
>>>info("felord.cn",city="beijing",age=20)
name= felord.cn age= 20 city= beijing

根据上面你或许能发现其它什么规律,另外命名关键字参数也可以设置关键字的默认值,但是传参必须带 keyword

>>>def info(name,*,age=20,city):
print("name=",name,"age=",age,"city=",city)

>>>info("felord.cn",city="beijing")
name= felord.cn age= 20 city= beijing
>>>info("felord.cn","beijing")
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: info() takes 1 positional argument but 2 were given

3.参数组合

这 5 种参数可以组合使用,**参数定义的顺序必须是:必选参数、默认参数、可变参数/命名关键字参数和关键字参数。特别注意可变参数无法和命名关键字参数混合。**对于任意函数,都可以通过类似function(args, *kw) 的形式调用它,无论它的参数是如何定义的。限于篇幅不再一一举例,可自行测试。

4. 总结

Python 的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。其中也有不少细节,参数类型也是学习 Python 函数的一个关键知识点。觉得对你有用请点一个 “在看”吧。

本文分享自微信公众号 - 码农小胖哥(Felordcn)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

今天关于澄清Python中的小数类型python isdigit 小数的讲解已经结束,谢谢您的阅读,如果想了解更多关于c语言中的小数类型有哪些、MOOC python笔记(二)python中的数据类型和基本语句、MySQL 将字符串类型的小数转换为保留位数的小数类型、Python 函数中的参数类型的相关知识,请在本站搜索。

本文标签:

上一篇为什么/何时在Python中`x == y`调用`y .__ eq __(x)`?(python max=x>y?x:y为什么非法)

下一篇如何在python中限制日志文件大小(如何在python中限制日志文件大小和内容)