Усечение поплавков в Python - PullRequest
90 голосов
/ 24 апреля 2009

Я хочу удалить цифры из числа с плавающей точкой, чтобы иметь фиксированное количество цифр после точки, например:

1.923328437452 -> 1.923

Мне нужно выводить в виде строки в другую функцию, а не печатать.

Также я хочу игнорировать потерянные цифры, а не округлять их.

Ответы [ 28 ]

4 голосов
/ 06 сентября 2014

Я сделал что-то вроде этого:

from math import trunc


def truncate(number, decimals=0):
    if decimals < 0:
        raise ValueError('truncate received an invalid value of decimals ({})'.format(decimals))
    elif decimals == 0:
        return trunc(number)
    else:
        factor = float(10**decimals)
        return trunc(number*factor)/factor
3 голосов
/ 09 марта 2018

Если вам интересна математика, это работает для + ve номеров:

>>> v = 1.923328437452
>>> v - v % 1e-3
1.923
1 голос
/ 24 июня 2018
def precision(value, precision):
    """
    param: value: takes a float
    param: precision: int, number of decimal places
    returns a float
    """
    x = 10.0**precision
    num = int(value * x)/ x
    return num
precision(1.923328437452, 3)

1,923

1 голос
/ 22 июля 2010

Просто хотел упомянуть, что старый трюк "make round () with floor ()" из

round(f) = floor(f+0.5)

можно повернуть, чтобы сделать этаж () из круглого ()

floor(f) = round(f-0.5)

Хотя оба эти правила разбивают отрицательные числа, поэтому его использование не идеально:

def trunc(f, n):
    if f > 0:
        return "%.*f" % (n, (f - 0.5*10**-n))
    elif f == 0:
        return "%.*f" % (n, f)
    elif f < 0:
        return "%.*f" % (n, (f + 0.5*10**-n))
1 голос
/ 07 ноября 2016

Общая и простая в использовании функция:

def truncate_float(number, length):
    """Truncate float numbers, up to the number specified
    in length that must be an integer"""

    number = number * pow(10, length)
    number = int(number)
    number = float(number)
    number /= pow(10, length)
    return number
1 голос
/ 11 апреля 2015

используйте numpy.round

import numpy as np
precision = 3
floats = [1.123123123, 2.321321321321]
new_float = np.round(floats, precision)
1 голос
/ 21 октября 2011

Int (16,5); это даст целочисленное значение 16, то есть trunc, не сможет указывать десятичные дроби, но думаю, что вы можете сделать это с помощью

import math;

def trunc(invalue, digits):
    return int(invalue*math.pow(10,digits))/math.pow(10,digits);
1 голос
/ 28 ноября 2014

Вот простой способ:

def truncate(num, res=3):
    return (floor(num*pow(10, res)+0.5))/pow(10, res)

для num = 1.923328437452, это выводит 1.923

1 голос
/ 22 июля 2010
def trunc(f,n):
  return ('%.16f' % f)[:(n-16)]
0 голосов
/ 20 декабря 2018

Основная идея, приведенная здесь , кажется мне лучшим подходом к этой проблеме. К сожалению, он получил меньше голосов, в то время как более поздний ответ , который имеет больше голосов, не является полным (как отмечено в комментариях). Надеемся, что приведенная ниже реализация обеспечивает короткое и полное решение для усечения .

def trunc(num, digits):
    l = str(float(num)).split('.')
    digits = min(len(l[1]), digits)
    return (l[0]+'.'+l[1][:digits])

, который должен заботиться обо всех найденных угловых случаях здесь и здесь .

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