как округлить до 10 места в питоне - PullRequest
7 голосов
/ 21 октября 2010

У меня есть куча чисел с плавающей точкой, и я хочу округлить их до следующего наибольшего кратного 10.

Например:

10.2 should be 20
10.0 should be 10
16.7 should be 20
94.9 should be 100

Мне нужно только, чтобы выйти из диапазона 0-100. Я пробовал math.ceil (), но он округляется только до ближайшего целого числа.

Спасибо заранее.

Ответы [ 4 ]

12 голосов
/ 21 октября 2010
from math import ceil

def ceil_to_tens(x):
    return int(ceil(x / 10.0)) * 10

Редактировать : хорошо, теперь, когда у меня есть незаслуженный значок «Хороший ответ» для этого ответа, я думаю, что сообщество должно найти правильное решение с использованием модуля decimal, который не страдает от этих проблем :) Спасибо Джеффу за то, что указал на это. Итак, решение с использованием decimal работает следующим образом:

from decimal import Decimal, ROUND_UP

def ceil_to_tens_decimal(x):
    return (Decimal(x) / 10).quantize(1, rounding=ROUND_UP) * 10

Конечно, приведенный выше код требует, чтобы x был целым числом, строкой или Decimal объектом - плавающие объекты не будут работать, поскольку это разрушит всю цель использования модуля decimal.

Жаль, что Decimal.quantize не работает должным образом с числами больше 1, это спасло бы трюк умножения с делением.

4 голосов
/ 21 октября 2010
>>> x = 16.7
>>> int( 10 * math.ceil(x/10.0))
1 голос
/ 21 октября 2010

Ответы здесь чреваты опасностью.Например 11*1.1 - 2.1 = 10.0, верно?Но подождите:

>>> x = 11*1.1 - 2.1
>>> int(ceil(x / 10.0)) * 10
20
>>> x
10.000000000000002
>>> 

Вы можете попробовать это

int(ceil(round(x, 12) / 10.0)) * 10

Но выбрать количество десятичных знаков для округления действительно сложно, так как трудно предсказать, как накапливается шум с плавающей запятой.Если действительно важно все время делать это правильно, то вам нужно использовать арифметику с фиксированной запятой или десятичную.

0 голосов
/ 22 октября 2010

Если вы ищете другое решение, которое не включает деление поплавка, вот то, которое использует модуль:

def ceil_to_tens_mod(x):
    tmp = int(ceil(x))
    mod10 = tmp % 10
    return tmp - mod10 + (10 if mod10 else 0)

Вероятно, есть какой-то способ упростить это, но вы идете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...