ฉันจะรับตัวเลขหลังจุดทศนิยมได้อย่างไร
ตัวอย่างเช่นถ้าฉันมี5.55
ฉันจะได้รับ.55
อย่างไร?
ฉันจะรับตัวเลขหลังจุดทศนิยมได้อย่างไร
ตัวอย่างเช่นถ้าฉันมี5.55
ฉันจะได้รับ.55
อย่างไร?
คำตอบ:
แนวทางง่ายๆสำหรับคุณ:
number_dec = str(number-int(number))[1:]
number_dec = str(number-int(number)).split('.')[1]
5.55 % 1
ซึ่งเป็นคำตอบที่มีประโยชน์โดยทั่วไปเช่นกันโดยสามารถใช้วิธีการแบ่งแบบโมดูโลในหลายภาษาในขณะที่คำตอบข้างต้นเป็นคำตอบเฉพาะของ Python
.55
) ซึ่งคุณอาจไม่คาดคิดเนื่องจากชื่อคำถาม!
str(5.55 - int(5.55))[1:]
ส่งคืน.5499999999999998
แทนที่.55
กล่าวถึงในคำถาม
5.55 % 1
โปรดทราบว่านี่จะไม่ช่วยคุณแก้ปัญหาการปัดเศษจุดลอยตัว กล่าวคือคุณอาจได้รับ:
0.550000000001
หรืออย่างอื่นเล็กน้อยจาก 0.55 ที่คุณคาดหวัง
modf
มันสามารถขันความแม่นยำได้เช่นกัน: math.modf(5.55)
จะกลับมา (0.5499999999999998, 5.0)
x%1
นี้เร็วกว่าx-int(x)
และmodf(x)[0]
วิธีการเกือบสองเท่า(เวลาคือ 980ns, 1.39us และ 1.47us โดยเฉลี่ยมากกว่า 1000000 รัน) คุณค่าของฉันx
เป็นบวกเสมอดังนั้นฉันจึงไม่ต้องกังวลเรื่องนั้น
ใช้modf :
>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
math.modf(2.53) = (0.5299999999999998, 2.0)
คำตอบที่คาดหวังคือ 0.53
สิ่งที่เกี่ยวกับ:
a = 1.3927278749291
b = a - int(a)
b
>> 0.39272787492910011
หรือใช้ numpy:
import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
การใช้decimal
โมดูลจากไลบรารีมาตรฐานคุณสามารถรักษาความแม่นยำดั้งเดิมและหลีกเลี่ยงปัญหาการปัดเศษจุดลอยตัว:
>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
ในฐานะที่เป็นkindall บันทึกในความคิดเห็นที่คุณจะมีการแปลงพื้นเมืองfloat
เพื่อสตริงแรก
n = 5.55
n คือDecimal(str(n)) % 1
ทศนิยมและคุณควรทำเพื่อให้ได้ส่วนที่เป็นเศษส่วน (นี่คือไม่จำเป็นถ้าคุณมีจำนวนเต็ม แต่มันไม่เจ็บ.)
10.0/3 % 1
อย่างน้อยในระบบของฉัน
Decimal.from_float(1.2)
(ซึ่งตอนนี้สามารถเขียนเป็นDecimal(1.2)
) คุณจะมีปัญหาในการปัดเศษซึ่งคำตอบนี้พยายามหลีกเลี่ยง
ลอง Modulo:
5.55%1 = 0.54999999999999982
คล้ายกับคำตอบที่ยอมรับวิธีที่ง่ายกว่าด้วยการใช้สตริงก็จะเป็นเช่นนั้น
def number_after_decimal(number1):
number = str(number1)
if 'e-' in number: # scientific notation
number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
elif "." in number: # quick check if it is decimal
number_dec = number.split(".")[1]
return number_dec
number = 5.55; "." in number
ให้TypeError: argument of type 'float' is not iterable
. และคุณจะทำอย่างไรถ้าnumber = 1e-5
?
float
; Python ไม่ได้เก็บความรู้ใด ๆ เกี่ยวกับรูปแบบที่แสดงออกมาในตอนแรกnumber = 1e-5
ตัวอย่างของฉันใช้ได้ดีพอ ๆ กันnumber = 0.00001
: การstr
แสดงตัวเลขอยู่ในสัญกรณ์ทางวิทยาศาสตร์ คุณจะต้องการที่จะจัดการกับe+
เช่นเดียวกับการe-
โดยวิธีการ
import math
orig = 5.55
whole = math.floor(orig) # whole = 5.0
frac = orig - whole # frac = 0.55
>>> n=5.55
>>> if "." in str(n):
... print "."+str(n).split(".")[-1]
...
.55
นี่เป็นวิธีแก้ปัญหาที่ฉันลอง:
num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))
บางครั้งค่าศูนย์ต่อท้าย
In [4]: def split_float(x):
...: '''split float into parts before and after the decimal'''
...: before, after = str(x).split('.')
...: return int(before), (int(after)*10 if len(after)==1 else int(after))
...:
...:
In [5]: split_float(105.10)
Out[5]: (105, 10)
In [6]: split_float(105.01)
Out[6]: (105, 1)
In [7]: split_float(105.12)
Out[7]: (105, 12)
เพียงใช้การหารตัวดำเนินการอย่างง่าย'/'และการแบ่งพื้น '//'คุณก็สามารถรับส่วนเศษส่วนของการลอยที่กำหนดได้อย่างง่ายดาย
number = 5.55
result = (number/1) - (number//1)
print(result)
ใช้พื้นและลบผลลัพธ์ออกจากจำนวนเดิม:
>> import math #gives you floor.
>> t = 5.55 #Give a variable 5.55
>> x = math.floor(t) #floor returns t rounded down to 5..
>> z = t - x #z = 5.55 - 5 = 0.55
import math
ทำไมไม่ลองใช้math.modf()
ล่ะ?
math.floor(-1.1) == -2
แต่int(-1.1) == -1
. แม้ว่าคำถามนี้int
จะใช้ถูกต้องกว่า
ตัวเลขลอยจะไม่ถูกจัดเก็บในรูปแบบทศนิยม (base10) อ่านเอกสาร pythonเกี่ยวกับเรื่องนี้เพื่อตอบสนองตัวเองว่าทำไม ดังนั้นจึงไม่แนะนำให้รับการแสดงฐาน 10 จากลูกลอย
ขณะนี้มีเครื่องมือที่ช่วยให้จัดเก็บข้อมูลตัวเลขในรูปแบบทศนิยม ด้านล่างนี้เป็นตัวอย่างการใช้Decimal
ห้องสมุด
from decimal import *
x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66' # True
y = 0.341343214124443151466
str(y)[-2:] == '66' # False
ตัวอย่าง:
import math
x = 5.55
print((math.floor(x*100)%100))
นี่คือตัวเลขสองตัวหลังจุดทศนิยม 55 จากตัวอย่างนั้น หากคุณต้องการตัวเลขหนึ่งให้คุณลดการคำนวณข้างต้นด้วย 10 หรือเพิ่มขึ้นอยู่กับจำนวนตัวเลขที่คุณต้องการหลังจากทศนิยม
import math
x = 1245342664.6
print( (math.floor(x*1000)%1000) //100 )
ได้ผลแน่นอน
สิ่งที่เกี่ยวกับ:
a = 1.234
b = a - int(a)
length = len(str(a))
round(b, length-2)
เอาท์พุท:
print(b)
0.23399999999999999
round(b, length-2)
0.234
เนื่องจากรอบถูกส่งไปตามความยาวของสตริงทศนิยม ('0.234') เราจึงสามารถลบ 2 เพื่อไม่นับ '0. ' และหาจำนวนจุดทศนิยมที่ต้องการได้ สิ่งนี้ควรได้ผลเกือบทุกครั้งเว้นแต่คุณจะมีตำแหน่งทศนิยมจำนวนมากและข้อผิดพลาดในการปัดเศษเมื่อคำนวณ b รบกวนพารามิเตอร์ที่สองของรอบ
คุณอาจต้องการลองสิ่งนี้:
your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])
0.55
มันจะกลับมา
number=5.55
decimal=(number-int(number))
decimal_1=round(decimal,2)
print(decimal)
print(decimal_1)
เอาต์พุต: 0.55
ดูสิ่งที่ฉันมักทำเพื่อให้ได้ตัวเลขหลังจุดทศนิยมใน python 3:
a=1.22
dec=str(a).split('.')
dec= int(dec[1])
หากคุณกำลังใช้แพนด้า:
df['decimals'] = df['original_number'].mod(1)
อีกทางเลือกหนึ่งคือการใช้re
โมดูลกับre.findall
หรือre.search
:
import re
def get_decimcal(n: float) -> float:
return float(re.search(r'\.\d+', str(n)).group(0))
def get_decimcal_2(n: float) -> float:
return float(re.findall(r'\.\d+', str(n))[0])
def get_int(n: float) -> int:
return int(n)
print(get_decimcal(5.55))
print(get_decimcal_2(5.55))
print(get_int(5.55))
0.55
0.55
5
หากคุณต้องการที่จะลดความซับซ้อน / การแก้ไข / การสำรวจการแสดงออกก็ถูกอธิบายอยู่ด้านบนขวาของแผงregex101.com หากคุณต้องการคุณสามารถดูในลิงค์นี้ว่าจะจับคู่กับอินพุตตัวอย่างได้อย่างไร
ฉันพบว่าตัวเลขจำนวนมากที่มีส่วนเศษส่วนจำนวนมากอาจทำให้เกิดปัญหาเมื่อใช้โมดูโล 1 เพื่อรับเศษส่วน
import decimal
>>> d = decimal.Context(decimal.MAX_PREC).create_decimal(
... '143000000000000000000000000000000000000000000000000000000000000000000000000000.1231200000000000000002013210000000'
... )
...
>>> d % 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
decimal.InvalidOperation: [<class 'decimal.DivisionImpossible'>]
ฉันจับส่วนอินทิกรัลและลบออกก่อนเพื่อช่วยให้ส่วนที่เหลือง่ายขึ้น
>>> d - d.to_integral()
Decimal('0.1231200000000000000002013210')
อีกตัวอย่างหนึ่งโดยใช้ modf
from math import modf
number = 1.0124584
# [0] decimal, [1] integer
result = modf(number)
print(result[0])
# output = 0124584
print(result[1])
# output = 1
วิธีแก้ปัญหาคือการใช้โมดูโลและการปัดเศษ
import math
num = math.fabs(float(5.55))
rem = num % 1
rnd_by = len(str(num)) - len(str(int(num))) - 1
print(str(round(rem,rnd_by)))
ผลลัพธ์ของคุณจะเป็น 0.55
คุณสามารถใช้สิ่งนี้:
number = 5.55
int(str(number).split('.')[1])
อีกวิธีหนึ่งที่บ้าคือ (โดยไม่ต้องแปลงสตริง):
number = 123.456
temp = 1
while (number*temp)%10 != 0:
temp = temp *10
print temp
print number
temp = temp /10
number = number*temp
number_final = number%temp
print number_final