จะรับตัวเลขหลังจุดทศนิยมได้อย่างไร?


124

ฉันจะรับตัวเลขหลังจุดทศนิยมได้อย่างไร

ตัวอย่างเช่นถ้าฉันมี5.55ฉันจะได้รับ.55อย่างไร?


คำตอบ:


28

แนวทางง่ายๆสำหรับคุณ:

number_dec = str(number-int(number))[1:]

31
แบบฝึกหัดสำหรับผู้อ่าน: ทำให้มันใช้งานได้สำหรับตัวเลขที่มากกว่าหรือเท่ากับ 10
สัญชาตญาณ

11
number_dec = str(number-int(number)).split('.')[1]
Ryan Allen

28
ลงคะแนนเนื่องจากเป็นแนวทางที่ซับซ้อนโดยไม่จำเป็น คำตอบที่ฉันต้องการคือคำตอบถัดไป5.55 % 1ซึ่งเป็นคำตอบที่มีประโยชน์โดยทั่วไปเช่นกันโดยสามารถใช้วิธีการแบ่งแบบโมดูโลในหลายภาษาในขณะที่คำตอบข้างต้นเป็นคำตอบเฉพาะของ Python
สตูว์

3
หมายเหตุ:วิธีนี้จะส่งคืนสตริงรวมถึงจุด ( .55) ซึ่งคุณอาจไม่คาดคิดเนื่องจากชื่อคำถาม!
T. Christiansen

9
str(5.55 - int(5.55))[1:]ส่งคืน.5499999999999998แทนที่.55กล่าวถึงในคำถาม
Cristian Ciupitu

200
5.55 % 1

โปรดทราบว่านี่จะไม่ช่วยคุณแก้ปัญหาการปัดเศษจุดลอยตัว กล่าวคือคุณอาจได้รับ:

0.550000000001

หรืออย่างอื่นเล็กน้อยจาก 0.55 ที่คุณคาดหวัง


7
สำหรับmodfมันสามารถขันความแม่นยำได้เช่นกัน: math.modf(5.55)จะกลับมา (0.5499999999999998, 5.0)
bereal

1
ไม่มีใครรู้ว่าวิธีใดจะเป็นการทำงานที่เร็วกว่าวิธีนี้ที่อธิบายไว้ข้างต้นหรือ: float b = a - int (a)? ฉันสงสัยในภายหลัง แต่ต้องการดูว่ามีการยืนยันหรือไม่

5
ใน Raspberry Pi วิธีx%1นี้เร็วกว่าx-int(x)และmodf(x)[0]วิธีการเกือบสองเท่า(เวลาคือ 980ns, 1.39us และ 1.47us โดยเฉลี่ยมากกว่า 1000000 รัน) คุณค่าของฉันxเป็นบวกเสมอดังนั้นฉันจึงไม่ต้องกังวลเรื่องนั้น
coderforlife

การทำงานของโมดูลเร็วขึ้นแน่นอน ไม่ต้องทำการค้นหาชื่อใด ๆ ในขณะที่การเรียกฟังก์ชัน int จะค้นหาตัวแปรส่วนกลาง
Enrico Borba

แฟนซีไม่ใช่แค่มี frac ()
mckenzm

155

ใช้modf :

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0

2
ทางออกที่ดี แต่math.modf(2.53) = (0.5299999999999998, 2.0)คำตอบที่คาดหวังคือ 0.53
ลอร์ดโลห์

4
@LordLoh นั่นเป็นเพราะการปัดเศษจุดลอยตัวและจะเกิดขึ้นด้วยวิธีใดก็ได้
Rena

@LordLoh พยายามใช้รอบ (0.5299999999999998, 2) เพื่อรับ 0.53 อีกวิธีหนึ่งคือการใช้ทศนิยมจากแพ็กเกจทศนิยม docs.python.org/2/library/decimal.html
SirJ

57

สิ่งที่เกี่ยวกับ:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011

หรือใช้ numpy:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)

33

การใช้decimalโมดูลจากไลบรารีมาตรฐานคุณสามารถรักษาความแม่นยำดั้งเดิมและหลีกเลี่ยงปัญหาการปัดเศษจุดลอยตัว:

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')

ในฐานะที่เป็นkindall บันทึกในความคิดเห็นที่คุณจะมีการแปลงพื้นเมืองfloatเพื่อสตริงแรก


เพื่อประโยชน์ของผู้ถามแบบเดิม: การลอยตัวจะต้องถูกแปลงเป็นสตริงก่อนจึงจะสามารถแปลงเป็นทศนิยมได้ ดังนั้นถ้าคุณมีn = 5.55n คือDecimal(str(n)) % 1ทศนิยมและคุณควรทำเพื่อให้ได้ส่วนที่เป็นเศษส่วน (นี่คือไม่จำเป็นถ้าคุณมีจำนวนเต็ม แต่มันไม่เจ็บ.)
kindall

2
@intuited: ไม่จำเป็นต้องเป็นทศนิยมมันยังใช้งานได้กับ float: 10.0/3 % 1อย่างน้อยในระบบของฉัน
aherok

2
คุณสามารถใช้ from_float แทนการใช้สตริง d = Decimal.float (1.2)
Matthew Purdon

@intuited หนึ่งรับส่วนทศนิยมเป็นจำนวนเต็มได้อย่างไร? ฉันได้ลอง to_integer () วิธีการแล้ว แต่ประเภทยังคงเป็นทศนิยม
D1X

1
@MatthewPurdon - หากคุณใช้Decimal.from_float(1.2)(ซึ่งตอนนี้สามารถเขียนเป็นDecimal(1.2)) คุณจะมีปัญหาในการปัดเศษซึ่งคำตอบนี้พยายามหลีกเลี่ยง
John Y


5

คล้ายกับคำตอบที่ยอมรับวิธีที่ง่ายกว่าด้วยการใช้สตริงก็จะเป็นเช่นนั้น

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?
Mark Dickinson

@ ทำเครื่องหมายคำถามคือฉันจะรับตัวเลขหลังจุดทศนิยมได้อย่างไร? ดังนั้นผู้ใช้จึงคาดหวังว่าจะลอยในสัญกรณ์ทศนิยม (ไม่ใช่สัญกรณ์วิทยาศาสตร์) ฉันได้เพิ่มบล็อกสำหรับสัญกรณ์วิทยาศาสตร์ด้วย
yosemite_k

ตัวเลขคือตัวเลข เป็นเพียงการแสดงของจำนวนที่อาจจะเป็นสัญลักษณ์ทางวิทยาศาสตร์ ดังนั้น "ลอยในสัญกรณ์ทศนิยม" จึงไม่สมเหตุสมผลที่นี่ เมื่อ Python เห็นมันก็แค่float; Python ไม่ได้เก็บความรู้ใด ๆ เกี่ยวกับรูปแบบที่แสดงออกมาในตอนแรกnumber = 1e-5ตัวอย่างของฉันใช้ได้ดีพอ ๆ กันnumber = 0.00001: การstrแสดงตัวเลขอยู่ในสัญกรณ์ทางวิทยาศาสตร์ คุณจะต้องการที่จะจัดการกับe+เช่นเดียวกับการe-โดยวิธีการ
Mark Dickinson


4
>>> n=5.55
>>> if "." in str(n):
...     print "."+str(n).split(".")[-1]
...
.55

2
สิ่งนี้ใช้ได้สำหรับตัวเลขพันธุ์สวน แต่ไม่ได้ผลสำหรับตัวเลขที่มีขนาดใหญ่ (หรือเล็ก) เพียงพอที่จะต้องใช้สัญกรณ์ทางวิทยาศาสตร์
kindall

2

นี่เป็นวิธีแก้ปัญหาที่ฉันลอง:

num = 45.7234
(whole, frac) = (int(num), int(str(num)[(len(str(int(num)))+1):]))

2

บางครั้งค่าศูนย์ต่อท้าย

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)

สิ่งนี้ทำเพื่ออะไร 0.000005?
Aditya Patnaik

2

เพียงใช้การหารตัวดำเนินการอย่างง่าย'/'และการแบ่งพื้น '//'คุณก็สามารถรับส่วนเศษส่วนของการลอยที่กำหนดได้อย่างง่ายดาย

number = 5.55

result = (number/1) - (number//1)

print(result)

1

ใช้พื้นและลบผลลัพธ์ออกจากจำนวนเดิม:

>> 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

5
ถ้าคุณกำลังจะไปimport mathทำไมไม่ลองใช้math.modf()ล่ะ?
ire_and_curses

@ire_and_curses: ฉันกำลังให้ทางเลือกอื่นในการแก้ปัญหา

1
floor ทำเช่นเดียวกับการหล่อเป็น int ดังนั้นจึงสามารถแทนที่ math.floor (t) ด้วย int (t)
QuantumKarl

@QuantumKarl ไม่พวกเขาแตกต่างกัน math.floor(-1.1) == -2แต่int(-1.1) == -1. แม้ว่าคำถามนี้intจะใช้ถูกต้องกว่า
Lambda Fairy

1

ตัวเลขลอยจะไม่ถูกจัดเก็บในรูปแบบทศนิยม (base10) อ่านเอกสาร pythonเกี่ยวกับเรื่องนี้เพื่อตอบสนองตัวเองว่าทำไม ดังนั้นจึงไม่แนะนำให้รับการแสดงฐาน 10 จากลูกลอย

ขณะนี้มีเครื่องมือที่ช่วยให้จัดเก็บข้อมูลตัวเลขในรูปแบบทศนิยม ด้านล่างนี้เป็นตัวอย่างการใช้Decimalห้องสมุด

from decimal import *

x = Decimal('0.341343214124443151466')
str(x)[-2:] == '66'  # True

y = 0.341343214124443151466
str(y)[-2:] == '66'  # False

1

ตัวอย่าง:

import math
x = 5.55
print((math.floor(x*100)%100))

นี่คือตัวเลขสองตัวหลังจุดทศนิยม 55 จากตัวอย่างนั้น หากคุณต้องการตัวเลขหนึ่งให้คุณลดการคำนวณข้างต้นด้วย 10 หรือเพิ่มขึ้นอยู่กับจำนวนตัวเลขที่คุณต้องการหลังจากทศนิยม


นี่เป็นสิ่งที่ดีเพราะส่งคืนค่าที่ไม่ใช่เศษส่วน แต่จะหักลบกับจำนวนลบ
Meow

น่าเสียดายที่มันใช้งานไม่ได้เกือบตลอดเวลา @Meow
Marquis of Lorne


0

สิ่งที่เกี่ยวกับ:

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 รบกวนพารามิเตอร์ที่สองของรอบ


คำอธิบายใด ๆ

0

คุณอาจต้องการลองสิ่งนี้:

your_num = 5.55
n = len(str(int(your_num)))
float('0' + str(your_num)[n:])

0.55มันจะกลับมา





0

อีกทางเลือกหนึ่งคือการใช้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 หากคุณต้องการคุณสามารถดูในลิงค์นี้ว่าจะจับคู่กับอินพุตตัวอย่างได้อย่างไร


แหล่ง

จะกำจัดตัวเลขลอยตัวเพิ่มเติมในการลบหลามได้อย่างไร?


0

ฉันพบว่าตัวเลขจำนวนมากที่มีส่วนเศษส่วนจำนวนมากอาจทำให้เกิดปัญหาเมื่อใช้โมดูโล 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')

0

อีกตัวอย่างหนึ่งโดยใช้ 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

0

วิธีแก้ปัญหาคือการใช้โมดูโลและการปัดเศษ

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



-2

อีกวิธีหนึ่งที่บ้าคือ (โดยไม่ต้องแปลงสตริง):

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.