簡體   English   中英

四舍五入 - 如果 1 則沒有小數,如果 0.01 則 2 小數

[英]Round decimal - If 1 then no decimal, if 0.01 then 2 decimal

我怎樣才能不使用像 1、2、3 這樣的隨機數截斷,而是直接使用十進制語法截斷?

例如:

  • 我有 4 和十進制到 1 所以截斷為 4。
  • 我有 1.5 和十進制到 1 所以截斷為 1。
  • 我有 1.5689 和十進制 0.01,所以截斷為 1.56。
  • 我有 1.7954 和十進制 0.001,所以截斷為 1.795。

我不知道這樣的 function 是否存在,但我想像這樣: round(1.5689, 0.01) -> 1.56

我什至不知道我們怎么能稱之為大聲笑......

這是decimal模塊的一個很好的應用程序,尤其是decimal.Decimal.quantize

import decimal

pairs = [
    ('4', '1'),
    ('1.5', '1'),
    ('1.5689', '0.01'),
    ('1.7954', '0.001')
    ]

for n, d in pairs:
    n, d = map(decimal.Decimal, (n, d))  # Convert strings to decimal number type
    result = n.quantize(d, decimal.ROUND_DOWN)  # Adjust length of mantissa
    print(result)

Output:

4
1
1.56
1.795

解決上述問題的一種可能方法是找出小數點分隔符后的小數位數. . 然后,如果您知道這些小數的位數,您可以輕松地四舍五入您的輸入數字。 下面是一個例子:

def truncate(number, decimal):
    decPart = str(decimal).split('.')
    p = len(decPart[1]) if len(decPart) > 1 else 1
    return round(number, p) if p > 1 else int(number)

print(truncate(4,1))
print(truncate(1.5,1))
print(truncate(1.5689,0.01))
print(truncate(1.7954,0.001))

Output:

4
1
1.57
1.795

我注意到您的圓形 function 樓層數。 如果是這種情況,您可以簡單地將您的數字作為字符串操作,將其四舍五入為您想要的小數位數,然后將其轉換回數字。

也可以這樣做,使用thisthis

import numpy as np
result = np.round(number, max(str(formattocopy)[::-1].find('.'),0))

結果,對於numberformattocopy值:

number=1.234
formattocopy=1.2

結果: 1.2

number=1.234
formattocopy=1.234

結果: 1.234

讓我們用數學代替編程!

我們知道round(x, n)x舍入到n位小數。 您想要的是將10**n傳遞給您的新 function 而不是n 所以,

def round_new(x, n):
    return round(x, int(-math.log10(n))

這應該會給你你想要的東西,而不需要任何字符串搜索/拆分操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM