පාවෙන දශම ලක්ෂ දෙකකට සීමා කිරීම


1706

මට 13.95 ටa රවුම් වීමට අවශ්‍යයි .

>>> a
13.949999999999999
>>> round(a, 2)
13.949999999999999

මෙම roundකාර්යය මම බලාපොරොත්තු මාර්ගය වැඩ කරන්නේ නැහැ.



7
හ්ම් ... ඔබ මුදල් නියෝජනය කිරීමට උත්සාහ කරනවාද? එසේ නම්, ඔබ ඩොලර් සඳහා පාවෙන භාවිතා නොකළ යුතුය. ඔබට බොහෝ විට සතයක් සඳහා පාවෙන භාවිතා කළ හැකිය, නැතහොත් ඔබ ආදර්ශනය කිරීමට උත්සාහ කරන කුඩාම පොදු මුදල් ඒකකය කුමක් වුවත්, හොඳම ක්‍රමය වන්නේ දශම නිරූපණයක් භාවිතා කිරීමයි, HUAGHAGUAH ඔහුගේ පිළිතුරෙන් යෝජනා කළ පරිදි.
SingleNegationElimination

65
පාවෙන මුදල් වර්ග නියෝජනය නොකිරීම වැදගත්ය. පාවෙන දේ හරියටම නැත. නමුත් සතයක් හෝ සතයක් පූර්ණ සංඛ්‍යා වේ. එබැවින් පූර්ණ සංඛ්‍යා යනු මුදල් නියෝජනය කිරීමේ නිවැරදි ක්‍රමයයි.
ඩාවුඩ් තාගාවි-නෙජාඩ්

2
@ ඩාවුඩ් තාගාවි-නෙජාඩ් හෝ ඊට වැඩි ගණනක් ... දශම වර්ගය
මූලික

17
මම බොහෝ විට මෙහි ප්‍රමාද වැඩියි, නමුත් මට අහන්න ඕන, පයිතන්ගේ සංවර්ධකයින් මෙම ගැටලුව විසඳා තිබේද? මම වටය කරන විට (13.949999999999999, 2), මට ලැබෙන්නේ 13.95 ක් පමණි. මම එය පයිතන් 2.7.6, සහ 3.4 හි අත්හදා බැලුවෙමි. එය වැඩ කරනවා. 2009 දී 2.7 පවා තිබුනේ දැයි විශ්වාස නැත. සමහර විට එය පයිතන් 2.5 දෙයක් ද?
bad_keypoints

Answers:


1727

සියලු සංඛ්‍යා හරියටම නිරූපණය කළ නොහැකි පාවෙන ලක්ෂ්‍ය සංඛ්‍යා සමඟ ඔබ පැරණි ගැටලුවට මුහුණ දී සිටී. විධාන රේඛාව ඔබට මතකයෙන් සම්පූර්ණ පාවෙන ලක්ෂ්‍ය ආකෘතිය පෙන්වයි.

පාවෙන ලක්ෂ්‍ය නිරූපණය සමඟ, ඔබේ වටකුරු අනුවාදය එකම අංකයකි. පරිගණක ද්විමය බැවින් ඒවා පාවෙන ලක්ෂ්‍ය සංඛ්‍යා පූර්ණ සංඛ්‍යාවක් ලෙස ගබඩා කර එය දෙකක බලයකින් බෙදයි. එබැවින් 13.95 125650429603636838 / (2 ** 53) ට සමාන ආකාරයකින් නිරූපණය කෙරේ.

ද්විත්ව නිරවද්‍යතා සංඛ්‍යා වල බිටු 53 ක් (ඉලක්කම් 16) නිරවද්‍යතාවයක් ඇති අතර සාමාන්‍ය පාවෙන කොටස්වල බිටු 24 ක් (ඉලක්කම් 8) නිරවද්‍යතාවයක් ඇත. මෙම පිඹුරා පාවෙමින් අවස්ථාවක වර්ගය ද්විත්ව නිරවද්යතාවයකින් භාවිතා වටිනාකම් ගබඩා කිරීම සඳහා.

උදාහරණයක් වශයෙන්,

>>> 125650429603636838/(2**53)
13.949999999999999

>>> 234042163/(2**24)
13.949999988079071

>>> a = 13.946
>>> print(a)
13.946
>>> print("%.2f" % a)
13.95
>>> round(a,2)
13.949999999999999
>>> print("%.2f" % round(a, 2))
13.95
>>> print("{:.2f}".format(a))
13.95
>>> print("{:.2f}".format(round(a, 2)))
13.95
>>> print("{:.15f}".format(round(a, 2)))
13.949999999999999

ඔබ සිටින්නේ දශම ස්ථාන දෙකකට පසුව නම් (උදාහරණයක් ලෙස මුදල් වටිනාකමක් පෙන්වීමට), එවිට ඔබට වඩා හොඳ තේරීම් කිහිපයක් තිබේ:

  1. ඩොලර් නොව, ශතවල නිඛිල සහ ගබඩා අගයන් භාවිතා කර ඩොලර් බවට පරිවර්තනය කිරීම සඳහා 100 න් බෙදන්න.
  2. නැතහොත් දශම වැනි ස්ථාවර ලක්ෂ්‍ය අංකයක් භාවිතා කරන්න .

30
H ක්‍රිස්ටියන් ගබඩා කර ඇති වටිනාකම සහ ඔබ එම අගය පෙන්වන ආකාරය අතර මූලික වෙනසක් ඇත. ප්‍රතිදානය හැඩතල ගැන්වීම මඟින් ඔබට අවශ්‍ය පරිදි පෑඩින් එකතු කිරීමට මෙන්ම කොමා බෙදුම්කරුවන් එකතු කිරීමට ඉඩ දිය යුතුය.
මූලික

23
වටිනා බව සඳහන් "%.2f" % round(a,2)ඔබ එහිදී එම පමණක් නොව, වැනි වැනි දේ කළ හැකිstr()
andilabs

20
පාවෙන ලක්ෂ්‍ය වටය මත මිනිසුන් සැමවිටම මුදල් උපකල්පනය කරන්නේ ඇයි? සමහර විට ඔබට අවශ්‍ය වන්නේ අඩු නිරවද්‍යතාවයකින් වැඩ කිරීමට ය.
වර්ක්

9
@radtek: ද්විමය අගය (වර්ගය float) යනු දශම සංඛ්‍යාවේ ආසන්නතම ආසන්න අගය පමණක් බව ඔබ තේරුම් ගත යුතුය (ඔබ මිනිසෙකු ලෙස හුරුපුරුදු). 0.245 තරම් එවැනි (අවසාන වශයෙන් නිරූපණය කළ හැකි) ද්විමය අගයක් නොමැත. එය සරලව නොපවතින අතර ගණිතමය වශයෙන් පැවතිය නොහැක . 0.245 ට ආසන්න ද්විමය අගය 0.245 ට වඩා මඳක් අඩු බැවින් ස්වාභාවිකවම එය වටයනු ලැබේ. ඒ හා සමානව, ද්විමය තුළ 0.225 වැනි දෙයක් නොමැත, නමුත් 0.225 ට ආසන්න ද්විමය අගය 0.225 ට වඩා තරමක් වැඩි බැවින් ස්වාභාවිකවම එය වටයනු ලැබේ.
ජෝන් වයි

12
@radtek: ඔබ වචනානුසාරයෙන් පැහැදිලි කිරීමක් ඉල්ලා සිටියා. වඩාත්ම සරල විසඳුම සැබවින්ම භාවිතා කිරීම Decimalවන අතර එය මෙම පිළිතුරෙහි ඉදිරිපත් කර ඇති එක් විසඳුමක් විය. අනෙක් කාරණය නම්, ඔබේ ප්‍රමාණය පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය කර පූර්ණ සංඛ්‍යා ගණිතය භාවිතා කිරීමයි. මෙම ප්‍රවේශයන් දෙකම වෙනත් පිළිතුරු සහ අදහස් දැක්වීම්වල ද දක්නට ලැබුණි.
ජෝන් වයි

596

නව ආකෘති පිරිවිතර ඇත, සංගීත ආකෘති පිරිවිතර මිනි-භාෂාව :

ඔබට මෙය කළ හැක්කේ:

"{:.2f}".format(13.949999999999999)

සටහන 1: ඉහත දැක්වෙන්නේ නූල් ය. පාවෙන ලෙස ලබා ගැනීම සඳහා, සරලව ඔතා float(...):

float("{:.2f}".format(13.949999999999999))

සටහන 2: සමඟ float()එතීමෙන් කිසිවක් වෙනස් නොවේ:

>>> x = 13.949999999999999999
>>> x
13.95
>>> g = float("{:.2f}".format(x))
>>> g
13.95
>>> x == g
True
>>> h = round(x, 2)
>>> h
13.95
>>> x == h
True

18
කොමාව එක් කිරීමට මෙන්ම ඔබට '{0:,.2f}'.format(1333.949999999)මුද්‍රණය කළ හැකි දේ '1,333.95'.
ස්ටීවන් බ්ලම්

@ OnurYıldırım: ඔව්, නමුත් ඔබට එය ඔතා ගත හැකිය float(); float("{0:.2f}".format(13.9499999))
ජොසෙෆ් හරුෂ්

5
Os ජොසෙෆ් හරුෂ් ඔබට එය පාවෙන () සමඟ ඔතා ගත හැකිය, නමුත් ඔබ කිසිවක් ලබාගෙන නැත. දැන් ඔබට යළිත් පාවීමක් තිබේ, එකම නිරවද්‍යතාවයකින්. 13.9499999999999 සහ 13.95 එකම පාවෙන.
නෙඩ් බැට්චෙල්ඩර්

4
Ed නෙඩ්බැචෙල්ඩර්: ඒවා සමාන බව මම එකඟ වෙමි, නමුත් මෙය පාවෙන දශම ලක්ෂ දෙකකට සීමා කරයි :)
ජොසෙෆ් හරුෂ්

11
මාර්ගය වන විට, පයිතන් 3.6 සිට අපට එෆ්-නූල් භාවිතා කළ හැකිය:f"Result is {result:.2f}"
ඇන්ඩ්‍රි සෙමකින්

297

ගොඩනගනු round()ලැබුවේ පයිතන් 2.7 හෝ ඊට පසුවය.

උදාහරණයක්:

>>> round(14.22222223, 2)
14.22

පරීක්ෂා කරන්න ලේඛගතකිරීම .


1
ඉතින් මෙය පයිතන් 2.7 අසමත් බව මම තේරුම් ගත යුතුද? එවැනි මූලික ශ්‍රිතයක් v 2.7 සිට v 3 දක්වා වෙනස් ප්‍රති results ල ලබා දෙන්නේ ඇයි?
StartupGuy

නමුත් round(2.16, 1)දිය 2.2පිඹුරා පමණක් ලබා ඇයි truncatefunc
jiamo

උදාහරණයක් ලෙස, ඔබ 2.675 අගය දශම ස්ථාන දෙකකට වට කිරීමට උත්සාහ කරන්නේ නම්, ඔබට මෙම >>> round(2.675, 2) 2.67 docs.python.org/2/tutorial/floatingpoint.html
අනතුර 89

4
පයිතන් 3 ප්‍රලේඛන පිටුවෙන්:Note The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float.
රිචඩ් ඩාලි

1.00000 වැනි අංකයක් මුද්‍රණය කිරීමට ඔබ මෙම ක්‍රමය භාවිතා කිරීමට උත්සාහ කළහොත් එය මුද්‍රණය කරන්නේ 1.0 ක් පමණි.
ජොෂ් කොරියා

144

සරලම ප්‍රවේශය වන්නේ format()ශ්‍රිතය භාවිතා කිරීමයි .

උදාහරණයක් වශයෙන්:

a = 13.949999999999999
format(a, '.2f')

13.95

මෙය දශම ලක්ෂ්‍ය දෙකකට වටකුරු නූලක් ලෙස පාවෙන අංකයක් නිපදවයි.


1
format return <str> 😀
Fannigurt

97

භාවිත

print"{:.2f}".format(a)

වෙනුවට

print"{0:.2f}".format(a)

බහු විචල්‍යයන් ප්‍රතිදානය කිරීමට උත්සාහ කිරීමේදී දෙවැන්න ප්‍රතිදාන දෝෂ වලට තුඩු දිය හැකි බැවිනි (අදහස් බලන්න).


2
මෙය විකාරයකි. ලබා දී ඇති ප්‍රකාශ දෙක පයිතන් 2.7 හි එක හා සමාන ලෙස හැසිරෙන අතර දෙවන ප්‍රකාශය පයිතන් 2.6 හි වලංගු වේ. (පයිතන් 3 හෝ පයිතන් <2.6 හි කිසිදු ප්‍රකාශයක් වලංගු නොවේ.) පළමු ආකෘතියට සංක්ෂිප්ත බව හැර වෙනත් වාසියක් නොමැත.
මාර්ක් ඩිකින්සන්

1
මම අදහස් කළේ, "{0: .2f} {0: .2f print" මුද්‍රණය කරන්න. ආකෘතිය (a, b) ප්‍රතිදානයේ වැරැද්දකට තුඩු දෙනු ඇත - එය 'a' අගය දෙවරක් ප්‍රතිදානය කරයි. "{:. 2f} {: .2f print" මුද්‍රණය කරන විට ආකෘතිය (a, b) 'a' සහ 'b' අගයන් ප්‍රතිදානය කරයි.
ඇලෙක්සි ඇන්ටනෙන්කෝ

2
පයිතන් 3 සඳහා, ඔබට වරහන් මුද්‍රණය එකතු කළ යුතුය (...). ඔවුන් තුළ මා ලියා ඇති සියල්ල හරි ය.
ඇලෙක්සි ඇන්ටනෙන්කෝ

"මම අදහස් කළේ, මුද්‍රණය කරන්න" {0: .2f} {0: .2f} ". ආකෘතිය (a, b) ප්‍රතිදානයේ වැරැද්දකට තුඩු දෙනු ඇත". අහ්. හොඳයි, එය ඊට හාත්පසින්ම වෙනස් ප්‍රකාශයකි! සමහර විට ඔබ ඔබේ පිළිතුර සංස්කරණය කළ යුතුද? (?? කුමක්ද "මතු වන දෝෂය" වත්මන් පිළිතුරු අදහස් කරන්නේ කුමක්ද, උදාහරණයක් ඔබට දෙවැනි ප්රකාශය ව්යතිරේකයක් නමුත් පළමු නැත මතු එහිදී නඩුව උදාහරණයක් දෙන්න පුළුවන්ද)
මාර්ක් ඩිකින්සන්

3
ඔබට විචල්යයන් දෙකක් තිබේ නම් මුද්‍රණයෙන් පසු ("{0: .2f} {1: .2f}". ආකෘතිය (a, b)) වනු ඇත
Hovo

95

බොහෝ සංඛ්‍යා පාවෙන ආකාරයෙන් නිරූපණය කළ නොහැක. ඔබේ ගණිතමය සූත්‍රය හෝ ඇල්ගොරිතම අවශ්‍ය වන නිසා ඔබට අංකය වට කිරීමට අවශ්‍ය නම්, ඔබට වටය භාවිතා කිරීමට අවශ්‍යය. ඔබට දර්ශනය නිශ්චිත නිරවද්‍යතාවයකට සීමා කිරීමට අවශ්‍ය නම්, වටය පවා භාවිතා නොකර එය එම නූල ලෙස සංයුති කරන්න. (ඔබට එය විකල්ප රවුම් ක්‍රමයක් සමඟ ප්‍රදර්ශනය කිරීමට අවශ්‍ය නම්, සහ ටොන් ගණනක් තිබේ නම්, එවිට ඔබට ප්‍රවේශයන් දෙක මිශ්‍ර කළ යුතුය.)

>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'

අවසාන වශයෙන්, සමහර විට වඩාත්ම වැදගත් දෙය නම්, ඔබට නිශ්චිත ගණිතයක් අවශ්‍ය නම් ඔබට පාවෙන කිසිවක් අවශ්‍ය නොවේ. සුපුරුදු උදාහරණය වන්නේ මුදල් සමඟ ගනුදෙනු කිරීම සහ 'ශත' පූර්ණ සංඛ්‍යාවක් ලෙස ගබඩා කිරීමයි.


68

පහත කේතය උත්සාහ කරන්න:

>>> a = 0.99334
>>> a = int((a * 100) + 0.5) / 100.0 # Adding 0.5 rounds it up
>>> print a
0.99

එහෙත් පරෙස්සම් වන්න, a හි වටිනාකම තවමත් අපැහැදිලි පාවීමකි. මෙහි බලන්න - repl.it/LJs (දකුණු කොටසේ ඉහළින් ඇති “සැසිය ධාවනය කරන්න” ක්ලික් කරන්න).
ජීවිත සමතුලිතතාවය

3
ඔබ මෙම ප්‍රවේශය සමඟ යන්නේ නම්, වඩාත් නිවැරදි නිරූපණයක් සඳහා ඔබ 0.5 ක් එකතු කළ යුතුය. int (a * 100 + 0.5) / 100.0; Math.ceil භාවිතා කිරීම තවත් විකල්පයකි.
arhuaco

3
H ශෂාන්ක් සවන්ත්: හොඳයි, එක් දෙයක් නම්, ඉදිරිපත් කර ඇති පිළිතුර වටකුරු නොවේ, එය කප්පාදු කරයි. අවසානයේදී අඩක් එකතු කිරීමේ යෝජනාව වටයනු ඇත, නමුත් පසුව roundශ්‍රිතය මුලින් භාවිතා කිරීමෙන් මෙය සිදු කිරීමෙන් කිසිදු ප්‍රතිලාභයක් නොමැත . තවත් දෙයක් නම්, මෙම විසඳුම තවමත් පාවෙන ලක්ෂ්‍යයක් භාවිතා කරන හෙයින්, OP හි මුල් ගැටළුව මෙම “විසඳුමේ” “නිවැරදි” අනුවාදය සඳහා පවා පවතී.
ජෝන් වයි

3
-1, මෙය roundශ්‍රිතය අනවශ්‍ය ලෙස නැවත සකස් කිරීමකි (එය ප්‍රශ්නයේදී භාවිතා කරන ලදි).
interjay

4
round()OP සඳහන් කළ පරිදි ක්‍රියා නොකරන්නේ නම් අවශ්‍ය වන ඉන්ටර්ජේ .
පිටිකෝස්

57

TLDR;)

ආදාන / ප්‍රතිදානයේ වටකුරු ගැටළුව පයිතන් 2.7.0 සහ 3.1 මගින් නිශ්චිතවම විසඳා ඇත .

නිවැරදිව වටකුරු අංකයක් ආපසු හැරවිය හැකි ලෙස පෙරළා හැරවිය හැකිය:
str -> float() -> repr() -> float() ...නැතහොත් Decimal -> float -> str -> Decimal
තවදුරටත් ගබඩා කිරීම සඳහා දශම වර්ගයක් අවශ්‍ය නොවේ.


(එතකොට, එය රාශිභූත පසුගිය බීටු දෝෂ ඉවත් කිරීම සඳහා වටකුරු සංඛ්යා ෙහෝ අඩු කිරීෙමන් ප්රතිඵලයක් රවුම් අවශ්ය විය හැක. නිශ්චිතවූ දශම අංක ගණිතමය තවමත් ප්රයෝජනවත් විය හැකි නමුත්, විසින් string බවට පරිවර්තනය str()(වලංගු ඉලක්කම් 12 දක්වා යයි වරදවා වටහා සමග සිටින බව ) සාමාන්‍යයෙන් ප්‍රමාණවත් වන්නේ නිරවද්‍ය නිරවද්‍යතාවයක් හෝ අනුක්‍රමික ගණිතමය මෙහෙයුම් සංඛ්‍යාවක් අවශ්‍ය නොවේ නම් පමණි.)

අසීමිත පරීක්ෂණය :

import random
from decimal import Decimal
for x in iter(random.random, None):           # Verify FOREVER that rounding is fixed :-)
    assert float(repr(x)) == x                # Reversible repr() conversion.
    assert float(Decimal(repr(x))) == x
    assert len(repr(round(x, 10))) <= 12      # Smart decimal places in repr() after round.
    if x >= 0.1:                              # Implicit rounding to 12 significant digits
        assert str(x) == repr(round(x, 12))   # by str() is good enough for small errors.
        y = 1000 * x                             # Decimal type is excessive for shopping
        assert str(y) == repr(round(y, 12 - 3))  # in a supermaket with Python 2.7+ :-)

ප්‍රලේඛනය

නිකුතු සටහන් බලන්න පයිතන් 2.7 - වෙනත් භාෂා වෙනස්කම් හතරවන ඡේදය කරයි:

පාවෙන ලක්ෂ්‍ය අංක සහ නූල් අතර පරිවර්තනය දැන් බොහෝ වේදිකාවල නිවැරදිව වට කර ඇත. මෙම පරිවර්තනයන් විවිධ ස්ථානවල සිදු වේ: str () පාවෙන සහ සංකීර්ණ සංඛ්‍යා මත; පාවෙන සහ සංකීර්ණ ඉදිකිරීම්කරුවන්; සංඛ්‍යා හැඩතල ගැන්වීම; භාවිතා කරමින් පාවෙන සහ සංකීර්ණ සංඛ්‍යා අනුක්‍රමිකකරණය සහ අක්‍රීය කිරීමmarshal, pickleසහ jsonමොඩියුල සහ අක්‍රීය කිරීම; පයිතන් කේතයේ පාවෙන සහ මන inary කල්පිත වචනාර්ථ විග්‍රහ කිරීම; සහ දශම සිට පාවෙන පරිවර්තනය.

මේ හා සම්බන්ධව, පාවෙන ලක්ෂ්‍ය අංක x හි repr () දැන් x වෙත ආපසු යාමට සහතික වන කෙටිම දශම නූල් මත පදනම්ව ප්‍රති result ලයක් ලබා දෙයි. ප්‍රති round ලයක් ලබා දෙයි. මීට පෙර එය x සිට 17 දශම ඉලක්කම් දක්වා වූ නූලක් ලබා දුන්නේය.

අදාළ ගැටළුව


වැඩි විස්තර:float පයිතන් 2.7 ට පෙර ආකෘතිකරණය ධාරාවට සමාන විය numpy.float64. සෑම වර්ගයක්ම වැදගත් වන පරිදි මෙම වර්ග දෙකම එකම 64 බිට් ආකෘතිකරණය කර ඇත; අනුක්‍රමය හිඩැස් නැති අතර පරිවර්තනය ආපසු හැරවිය හැකිය. සරලවම: ඔබට සමහර විට numpy.float64 අංකයක් තිබේ නම්, එය සංඛ්‍යාත්මක සකසනයන් සඳහා නොව මිනිසුන් සඳහා ආකෘතිකරණය කිරීම සඳහා සාමාන්‍ය පාවෙන බවට පරිවර්තනය කරන්න, එසේ නොමැතිනම් පයිතන් 2.7+ සමඟ තවත් කිසිවක් අවශ්‍ය නොවේ. බිට් 52 මැන්ටිස්සා සමඟ අයිඊඊඊ 754 ද්විත්ව නිරවද්‍යතාව . විශාල වෙනසක් වන්නේ np.float64.__repr__අතිරික්ත දශම සංඛ්‍යාවක් සමඟ නිතර සංයුති කර ඇති අතර එමඟින් කිසිදු බිට් එකක් නැති නොවේ. නමුත් වලංගු IEEE 754 අංකයක් 13.949999999999999 සහ 13.950000000000001 අතර නොමැත. repr(float(number_as_string))ප්‍රති result ලය යහපත් නොවන අතර පරිවර්තනය අංකී සමඟ ආපසු හැරවිය නොහැක. අනිත් අතට:float.__repr__


පහත් කොට සලකන්නේ ඇයි? ප්‍රශ්නය වූයේ පයිතන් float(ද්විත්ව නිරවද්‍යතාව) සහ සාමාන්‍යය roundමිස numpy.double සහ එය නූල් බවට පරිවර්තනය කිරීම ගැන නොවේ. සරල පයිතන් වටකුරු කිරීම පයිතන් 2.7 ට වඩා හොඳින් කළ නොහැක. බොහෝ පිළිතුරු 2.7 ට පෙර ලියා ඇත, නමුත් ඒවා යල්පැන ඇති නමුත් ඒවා මුලින් ඉතා හොඳ විය. මගේ පිළිතුරට හේතුව මෙයයි.
hynekcer

ඔබ "සැඟවුණු බිට්" ඇතුළත් කරන විට බිටු 53 ක් වන අතර එය 1"ක්‍රමානුකූලව ගලායාම" තුළ හැර ව්‍යංගයෙන් වේ.
රික් ජේම්ස්

එය වටයේ වරදක් නොවේ, එය දර්ශන දෝෂයකි.
රික් ජේම්ස්

ඔව්, එය හොඳින් දන්නා කරුණකි. කෙසේ වෙතත් ඔබ පයිතන් 2.7 නිකුතු සටහන් හෝ මගේ පා ​​text ය හෝ කිසියම් දෙයකට විරුද්ධ වුවහොත් මට සන්දර්භයක් මග හැරේ. මෙම ප්‍රශ්නයේ අරමුණට වඩා එය සංකීර්ණ ය. බිටු 32 ඉන්ටෙල් චිප වල වටකුරු දෝෂය හේතුවෙන් පයිතන් 2.7 හි නූල් සිට පාවෙන බවට පරිවර්තනය කර ඇති බවත් "වටකුරු () ශ්‍රිතය දැන් නිවැරදිව වටකුරු" බවත් එකතු කළ යුතුය. ( සටහන් මුදා හැරීම - 3.1 විශේෂාංග 2.7 වෙත ආපසු යවන ලදි ). ඔබට එකඟ විය හැකිද?
හයිනෙකර්

1
අපොයි, එය a*bඑදිරිව b*a. සබැඳි වලට ස්තූතියි - නොස්ටැල්ජියා.
රික් ජේම්ස්


52

පයිතන් <3 (උදා. 2.6 හෝ 2.7) සමඟ, එසේ කිරීමට ක්‍රම දෙකක් තිබේ.

# Option one 
older_method_string = "%.9f" % numvar

# Option two (note ':' before the '.9f')
newer_method_string = "{:.9f}".format(numvar)

3 ට වැඩි පයිතන් අනුවාද සඳහා (උදා: 3.2 හෝ 3.3), දෙවන විකල්පය වඩාත් සුදුසු බව සලකන්න .

දෙවන විකල්පය පිළිබඳ වැඩි විස්තර සඳහා, පයිතන් ප්‍රලේඛනයෙන් සංගීත හැඩතල ගැන්වීම පිළිබඳ මෙම සබැඳිය යෝජනා කරමි .

පළමු විකල්පය පිළිබඳ වැඩි විස්තර සඳහා, මෙම සබැඳිය ප්‍රමාණවත් වන අතර විවිධ ධජ පිළිබඳ තොරතුරු ඇත .

යොමුව: පාවෙන ලක්ෂ්‍ය අංකය නිශ්චිත නිරවද්‍යතාවකට පරිවර්තනය කරන්න, ඉන්පසු නූල් වලට පිටපත් කරන්න


ඔබ පූර්ණ සංඛ්‍යාවක් නියෝජනය කරන්නේ කෙසේද? මම "{i3}" ආකෘතිය භාවිතා කරන්නේ නම් (numvar) මට දෝෂයක් ඇතිවේ.
skytux

මා අදහස් කළේ මෙයයි: එසේ නම් numvar=12.456, "{:.2f}".format(numvar)අස්වැන්නක් 12.46ලැබුණද "{:2i}".format(numvar)දෝෂයක් ලබා දෙන අතර මම බලාපොරොත්තු වෙමි 12.
skytux

51

මෙහි කිසිවෙකු තවමත් එය සඳහන් කර ඇති බවක් නොපෙනේ, එබැවින් පයිතන් 3.6 හි f-string / template-string ආකෘතියෙන් උදාහරණයක් දෙන්නම්, එය ලස්සනට පිළිවෙලට ඇතැයි මම සිතමි:

>>> f'{a:.2f}'

එය දිගු උදාහරණ සමඟ හොඳින් ක්‍රියා කරයි, ක්‍රියාකරුවන් සමඟ සහ පාරෙන් අවශ්‍ය නොවේ:

>>> print(f'Completed in {time.time() - start:.2f}s')


30

පයිතන් 2.7 හි:

a = 13.949999999999999
output = float("%0.2f"%a)
print output

1
මෙය කිසිසේත් උදව් නොකරයි. outputසතුව හරියටම සමාන ලෙස අගය aඔබ මෙන්ම ලිඛිත විය හැකිය, ඒ print aවෙනුවට print outputපසුගිය අනුකූලව.
මාර්ක් ඩිකින්සන්

Ark මාක් ඩිකින්සන් කරුණාකර නැවත උත්සාහ කරන්න. මන්ද එය මගේ සම්පාදකයා තුළ අපේක්ෂා කළ පරිදි ක්‍රියාත්මක වන බැවිනි.
ශෂාන්ක් සිං

1
ඔබට මගේ අදහස මග හැරී ඇත. ඔව්, ඔබේ කේතය මුද්‍රණය වේ13.95 වේ. නමුත් පයිතන් 2.7 හි print aමෙම විශේෂිත අගය සඳහා aඑසේ වේ, එබැවින් ආකෘතිකරණ පියවරේ ලක්ෂ්‍යය කුමක්ද යන්න පැහැදිලි නැත.
මාර්ක් ඩිකින්සන්

Ark මාක් ඩිකින්සන් මම කේතය සංස්කරණය කර ඇත. 'මුද්‍රණය a' මුද්‍රණ ප්‍රතිදානය හා සමාන අගයක් මුද්‍රණය කරන බව මම එකඟ වෙමි. නමුත් ඔබ "a == ප්‍රතිදානය" සංසන්දනය කළහොත්, ප්‍රති result ලය "අසත්‍යය" වනුයේ හැඩතල ගැන්වීමේ පියවර පාවෙන අගය "a" සිට දශම ලක්ෂ්‍ය දෙකකට වට කරන බැවිනි.
ශෂාන්ක් සිං

1
ඔබ ඇත්තටම උත්සාහ කළාද? a == outputඔබ පෙන්වන කේතය සඳහා ? එය Trueමට ලබා දෙන අතර, එය ඔබටත් ප්‍රයෝජනවත් වේ යැයි මම සැක කරමි.
මාර්ක් ඩිකින්සන්

22

පයිතන් නිබන්ධනයේ පාවෙන ලක්ෂ්‍ය අංක ගණිතය: ගැටළු සහ සීමාවන් යන උපග්‍රන්ථයක් ඇත. එය කියවන්න. එය සිදුවන්නේ කුමක්ද සහ පයිතන් උපරිමයෙන් කරන්නේ ඇයිද යන්න පැහැදිලි කරයි. එය ඔබට ගැලපෙන උදාහරණයක් පවා ඇත. මට ටිකක් උපුටා දැක්වීමට ඉඩ දෙන්න:

>>> 0.1
0.10000000000000001

ඔබ round() අපේක්ෂා කරන තනි අංකයට එය නැවත කැපීමට ශ්‍රිතය භාවිතා කිරීමට ඔබ පෙළඹෙනු ඇත . නමුත් එයින් කිසිදු වෙනසක් නැත:

>>> round(0.1, 1)
0.10000000000000001

ගැටළුව වන්නේ ගබඩා කර ඇති ද්විමය පාවෙන ලක්ෂ්‍ය අගය “0.1” දැනටමත් කළ හැකි හොඳම ද්විමය ආසන්න වීමයි 1/10, එබැවින් එය නැවත වට කිරීමට උත්සාහ කිරීමෙන් එය වඩා හොඳ කළ නොහැක: එය දැනටමත් ලැබෙන තරමට හොඳයි.

තවත් ප්‍රතිවිපාකයක් නම් , 0.1 හරියටම නොවන බැවින් 1/10, අගයන් දහයක් සාරාංශ කිරීමෙන් හරියටම ප්‍රති 0.1yield ල නොලැබේ 1.0:

>>> sum = 0.0
>>> for i in range(10):
...     sum += 0.1
...
>>> sum
0.99999999999999989

ඔබේ ගැටළු වලට එක් විකල්පයක් සහ විසඳුමක් වනුයේ decimalමොඩියුලය භාවිතා කිරීමයි .


19

Att මැට් පෙන්වා දුන් පරිදි, පයිතන් 3.6 මඟින් එෆ්-නූල් සපයන අතර ඔවුන්ට කැදැලි පරාමිතීන් ද භාවිතා කළ හැකිය :

value = 2.34558
precision = 2
width = 4

print(f'result: {value:{width}.{precision}f}')

එය දර්ශනය වේ result: 2.35



11

දශම වස්තුව සහ වටකුරු () ක්‍රමයේ සංයෝජනය භාවිතා කරන්න.

Python 3.7.3
>>> from decimal import Decimal
>>> d1 = Decimal (13.949999999999999) # define a Decimal
>>> d1 
Decimal('13.949999999999999289457264239899814128875732421875')
>>> d2 = round(d1, 2) # round to 2 decimals
>>> d2
Decimal('13.95')

7

පයිතන් සහ ජාවාස්ක්‍රිප්ට් වැනි ගතික භාෂාවල පාවෙන ස්ථානය සවි කිරීම සඳහා මම මෙම තාක්ෂණය භාවිතා කරමි

# For example:
a = 70000
b = 0.14
c = a * b

print c # Prints 980.0000000002
# Try to fix
c = int(c * 10000)/100000
print c # Prints 980

ඔබට පහත පරිදි දශම භාවිතා කළ හැකිය:

from decimal import *
getcontext().prec = 6
Decimal(1) / Decimal(7)
# Results in 6 precision -> Decimal('0.142857')

getcontext().prec = 28
Decimal(1) / Decimal(7)
# Results in 28 precision -> Decimal('0.1428571428571428571428571429')

1
getcontext().prec = 6ශ්‍රිතයේ විෂය පථයට හෝ සියලුම ස්ථාන සඳහා පමණක් ක්‍රියා කරයිද?
ජුලියෝ මැරින්ස්

1
සන්දර්භය යනු ගණිතමය මෙහෙයුම් සඳහා පරිසරයයි. ඒවා නිරවද්‍යතාව පාලනය කරයි, වටකුරු කිරීම සඳහා නීති රීති සකසයි, ව්‍යතිරේකයන් ලෙස සලකන්නේ කුමන සං als ාද යන්න තීරණය කරයි, සහ on ාතකයින් සඳහා පරාසය සීමා කරයි. සෑම නූලකටම එහි වර්තමාන සන්දර්භය ඇත @ ජුලියෝ මාරින්ස්
සියමන්ඩ්

7
from decimal import Decimal


def round_float(v, ndigits=2, rt_str=False):
    d = Decimal(v)
    v_str = ("{0:.%sf}" % ndigits).format(round(d, ndigits))
    if rt_str:
        return v_str
    return Decimal(v_str)

ප්රතිපල:

Python 3.6.1 (default, Dec 11 2018, 17:41:10)
>>> round_float(3.1415926)
Decimal('3.14')
>>> round_float(3.1445926)
Decimal('3.14')
>>> round_float(3.1455926)
Decimal('3.15')
>>> round_float(3.1455926, rt_str=True)
'3.15'
>>> str(round_float(3.1455926))
'3.15'


5

මේ වගේ ලැම්බඩා ශ්‍රිතයක් ගැන කුමක් කිව හැකිද:

arred = lambda x,n : x*(10**n)//1/(10**n)

ඔබට කළ හැකි මේ ආකාරයෙන්:

arred(3.141591657,2)

ලබා ගන්න

3.14

4

එය 1,2,3 වැනි සරල ය:

  1. දශම භාවිතා කරන්නනිවැරදිව නිවැරදිව වටකුරු දශම පාවෙන ලක්ෂ්‍ය අංක ගණිතය සඳහා මොඩියුලය :

    d = දශම (10000000.0000009)

වටය ළඟා කර ගැනීමට:

   d.quantize(Decimal('0.01'))

ප්‍රති results ල ලබා දෙනු ඇත Decimal('10000000.00')

  1. ඉහත ඩ්‍රයි කරන්න:
    def round_decimal(number, exponent='0.01'):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(exponent))

හෝ

    def round_decimal(number, decimal_places=2):
        decimal_value = Decimal(number)
        return decimal_value.quantize(Decimal(10) ** -decimal_places)
  1. මෙම පිළිතුර ඉහළට ඔසවන්න :)

PS: අන් අයව විවේචනය කිරීම: හැඩතල ගැන්වීම වටකුරු නොවේ.


2

අංකයක් විභේදනයකට යොමු කිරීම සඳහා, හොඳම ක්‍රමය පහත දැක්වෙන ක්‍රමයයි, එය ඕනෑම විභේදනයක් සමඟ ක්‍රියා කළ හැකිය (දශම දෙකකට 0.01 හෝ වෙනත් පියවර සඳහා):

>>> import numpy as np
>>> value = 13.949999999999999
>>> resolution = 0.01
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
13.95

>>> resolution = 0.5
>>> newValue = int(np.round(value/resolution))*resolution
>>> print newValue
14.0

පයිතන් 3.4.3 සහ අංක 1.9.1 මත මට වැඩ කරන්නේ නැද්ද? >>> අංක ලෙස np ලෙස ආනයනය කරන්න >>> res = 0.01 >>> අගය = 0.184 >>> np.round (අගය / res) * res 0.17999999999999999
szeitlin

1
ලියකියවිලි සොයන විට ගැටලුව පැමිණෙන්නේ numpy.roundනිරවද්‍යතාවයෙන් / නිරවද්‍යතාවයෙන් බව මට පෙනේ . එබැවින් විභේදනය සමඟ ගුණ කිරීමට පෙර එය int ලෙස අර්ථ දැක්විය යුතුය. මම කේතය යාවත්කාලීන කළා. ඒ සඳහා ඔබට ස්තූතියි!
iblasi

අවශ්‍ය වන්නේ numpy.float64np.round හි ප්‍රති result ලය floatහෝ සරලව භාවිතා කිරීමයි round(value, 2). 13.949999999999999 (= 1395/100.) සහ 3.950000000000001 (= 1395 * .01) අතර වලංගු IEEE 754 අංකයක් නොමැත. ඔබේ ක්‍රමය හොඳම යැයි ඔබ සිතන්නේ ඇයි? මුල් අගය 13.949999999999999289 (= අගය = වටය (අගය, 2)) ඔබගේ 13.95000000000000178 (np.float96 විසින් මුද්‍රණය කර ඇත) ට වඩා නිවැරදි ය. අංකනය සඳහා තවත් තොරතුරු දැන් මගේ පිළිතුරට එකතු කර ඇති අතර ඔබ වැරදීමකින් පහත් කොට සලකනු ඇත. එය මුලින් අංකනය ගැන නොවේ.
hynekcer

මගේ පිළිතුර හොඳම යැයි මම නොසිතමි. සීමාව පාවෙන n දශමයට උදාහරණයක් එකතු කිරීමට අවශ්‍ය නමුත් නිර්වචනය කළ ආසන්නතම. ඔබ කී පරිදි මම පරීක්ෂා කළෙමි, ඔබ වෙනුවට zzzeitlin උදාහරණය සඳහා intද භාවිතා floatකළ හැකිය. ඔබගේ අමතර අදහස් දැක්වීමට ස්තූතියි. (කණගාටුයි, නමුත් මම ඔබව පහත් කොට සැලකුවේ නැත)
iblasi

සංඛ්‍යාත්මක සැකසුම් (පැන්ඩා) සඳහා නව පරායත්තතාවයක් එක් කිරීම “හොඳම ක්‍රමය” ද?
හෙජාස්මන්

1

lambda x, n: int (x * 10 n + .5) / 10 n වසර ගණනාවක් තිස්සේ බොහෝ භාෂාවලින් මා වෙනුවෙන් වැඩ කර ඇත .


-13

මම භාවිතා කරන ක්‍රමය නූල් පෙති කැපීමයි. එය සාපේක්ෂව ඉක්මන් හා සරල ය.

පළමුවෙන්ම, පාවෙන නූලකට හරවන්න, ඔබ කැමති දිග තෝරන්න.

float = str(float)[:5]

ඉහත තනි පේළියේ දී, අපි අගය නූලකට පරිවර්තනය කර, පසුව එහි පළමු ඉලක්කම් හතරට හෝ අක්ෂරවලට පමණක් ඇතුළත් කර ඇත්තෙමු.

උපකාරවත් වන බලාපොරොත්තුව!


2
කරුණාකර බහුවිධ ප්‍රශ්න වලට සමාන පිළිතුරු පළ නොකරන්න.
vaultah

18
WOW ... tdh ... කරුණාකර කිසි විටෙක ගිණුම්කරණ මෘදුකාංගයක් සාදන්න ... අංකය 113.94 ක් වුවහොත් කුමක් සිදුවේද ?? මෙහි ප්‍රති result ලය වනුයේ 113.9 ක් ... 0.04 ක් අතුරුදහන් වීමයි .... එසේම මීට වසර 5 කට පෙර පිළිතුරු දැනටමත් ඇත ....
Angry 84
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.