Точное значение после плавающей точки не округление [дубликат]

Вы можете использовать конфигурационную электронную почту с помощью codeigniter, например, используя smtp (простой способ):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', //your smtp host
        'smtp_port' => 26, //default port smtp
        'smtp_user' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   //conditional true
}

Это работает для меня!

86
задан Eric Leschinski 20 April 2016 в 18:51
поделиться

25 ответов

89
ответ дан David Z 22 August 2018 в 01:23
поделиться

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

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
4
ответ дан Alvaro 22 August 2018 в 01:23
поделиться
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

0
ответ дан Andrew Olson 22 August 2018 в 01:23
поделиться

По-настоящему pythonic способ сделать это

from decimal import *

with localcontext() as ctx:
    ctx.rounding = ROUND_DOWN
    print Decimal('1.923328437452').quantize(Decimal('0.001'))
8
ответ дан Antony Hatchkins 22 August 2018 в 01:23
поделиться

Что-то достаточно простое, чтобы вписываться в список, без библиотек или других внешних зависимостей. Для Python> = 3.6 очень просто писать с помощью f-строк.

Идея состоит в том, чтобы преобразование строк округловало в другое место, чем вам нужно и затем отбросить последнюю цифру.

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1] for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.800', '0.888', '1.125', '1.250', '1.500']

Конечно, здесь есть округление (именно для четвертой цифры), но округление в некоторой точке невозможно. В случае, если переход между усечением и округлением имеет значение, вот немного лучший пример:

>>> nacc = 6  # desired accuracy (maximum 15!)
>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nacc}f}'[:-(nacc-nout)] for x in [2.9999, 2.99999, 2.999999, 2.9999999]]
>>> ['2.999', '2.999', '2.999', '3.000']

Бонус: удаление нулей справа

>>> nout = 3  # desired number of digits in output
>>> [f'{x:.{nout+1}f}'[:-1].rstrip('0') for x in [2/3, 4/5, 8/9, 9/8, 5/4, 3/2]]
['0.666', '0.8', '0.888', '1.125', '1.25', '1.5']
0
ответ дан Axel 22 August 2018 в 01:23
поделиться

В моем приглашении Python 2.7:

>>> int(1.923328437452 * 1000)/1000.0 1.923

10
ответ дан Bill 22 August 2018 в 01:23
поделиться

Если вы представляете какую-то математику, это работает для + ve чисел:

>>> v = 1.923328437452
>>> v - v % 1e-3
1.923
3
ответ дан coldspeed 22 August 2018 в 01:23
поделиться

Простой скрипт python -

n = 1.923328437452
n = float(int(n * 1000))
n /=1000
7
ответ дан Community 22 August 2018 в 01:23
поделиться
  • 1
    Чистый ответ. Вы просто пропустите один шаг, чтобы преобразовать обратно в float до деления на 1000. В противном случае вы получите 1. – Yohan Obadia 7 November 2016 в 17:55

Результатом round является float, поэтому смотрите (пример из Python 2.6):

>>> round(1.923328437452, 3)
1.923
>>> round(1.23456, 3)
1.2350000000000001

Вам будет лучше при использовании форматированной строки:

>>> "%.3f" % 1.923328437452
'1.923'
>>> "%.3f" % 1.23456
'1.235'
30
ответ дан Ferdinand Beyer 22 August 2018 в 01:23
поделиться
  • 1
    На моем Python эти раунды: «% .3f»% 1.23456 == '1.235' – David Z 24 April 2009 в 00:11
  • 2
    @David: Вы абсолютно правы. – Ferdinand Beyer 24 April 2009 в 00:15
  • 3
    Это более элегантно, чем ручная форматирование бессмысленных строк, хорошая почта! – rsethc 20 March 2018 в 08:56
  • 4
    round(1.23456, 3) - 1.235, а не 1.2350000000000001 – Ahmad 22 May 2018 в 16:17
  • 5
    @Ahmad не обязательно. Пример здесь из Python 2.6 (обратите внимание на дату ответа). Форматирование строк было улучшено в Python 2.7 / 3.1, поэтому, вероятно, вы получаете разные результаты. Тем не менее, числа с плавающей запятой часто имеют неожиданные строковые представления, см.: docs.python.org/3.6/tutorial/floatingpoint.html – Ferdinand Beyer 22 May 2018 в 18:08

Хотелось бы упомянуть, что старый метод make () с тэгом

round(f) = floor(f+0.5)

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

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
ответ дан itsadok 22 August 2018 в 01:23
поделиться

>>> floor ((1.23658945) * 10 ** 4) / 10 ** 4 1.2365

# делить и умножать на 10 ** количество желаемых цифр

0
ответ дан JohnA 22 August 2018 в 01:23
поделиться
n = 1.923328437452
str(n)[:4]
16
ответ дан john_dough 22 August 2018 в 01:23
поделиться
  • 1
    Простой и пифонический. 4 - это размер всего числа, но не только цифры после точки. – GaTTaCa 11 December 2013 в 21:48
  • 2
    Поэтому, если пользователь входит, например, в 2, у вас будет десятичная точка . в конце строки - не очень хорошее решение, я думаю. – Zelphir 2 March 2016 в 11:28
  • 3
    Это относится к случаю к этому числу. Как это обобщить до 11.923328437452? – polarise 10 July 2018 в 16:14
  • 4
def trunc(f,n):
  return ('%.16f' % f)[:(n-16)]
1
ответ дан karthikr 22 August 2018 в 01:23
поделиться
round(1.923328437452, 3)

См. документацию Python по стандартным типам . Вам нужно немного прокрутить список, чтобы перейти к круглой функции. По сути, второе число указывает, сколько десятичных знаков округлить до.

134
ответ дан Lightness Races in Orbit 22 August 2018 в 01:23
поделиться
  • 1
    сладкий, я не знал, что есть функция round () - я могу использовать это! (Я бы поднял ставку, но на самом деле это не ответ на вопрос OP ...) – David Z 24 April 2009 в 00:06
  • 2
    – Jarret Hardie 24 April 2009 в 00:07
  • 3
    Я имел в виду, что округление - это не то, что мне нужно. Мне нужно усечь, что другое. – Joan Venge 24 April 2009 в 00:09
  • 4
    Ahhh, справедливо. Моя ошибка извините. – Teifion 24 April 2009 в 11:22
  • 5
    Это очень много для неправильного решения! Один из этих странных раритетов Stackoverflow. Интересно, есть ли для этого значок? – Matt O'Brien 3 November 2014 в 19:51
  • 6
    Это просто ужасает, сколько неправильных ответов (и наоборот, за неправильные ответы) есть для этого вопроса. – nullstellensatz 4 February 2015 в 14:33

Существует простой способ обхода проблемы в python 3. Где вырезать I с помощью переменной help decPlace, чтобы упростить ее адаптацию.

f = 1.12345
decPlace= 4
f_cut = int(f * 10**decPlace) /10**decPlace

Выход:

f = 1.1234

Надеюсь, это поможет.

0
ответ дан MBreg 22 August 2018 в 01:23
поделиться
[Д0] INT (16,5); это даст целое значение 16, т. е. trunc, не сможет указать десятичные числа, но предположим, что вы можете сделать это с помощью

import math;

def trunc(invalue, digits):
    return int(invalue*math.pow(10,digits))/math.pow(10,digits);
1
ответ дан Pieter 22 August 2018 в 01:23
поделиться
# value  value to be truncated
# n  number of values after decimal

value = 0.999782
n = 3
float(int(value*1en))*1e-n
-1
ответ дан Praveen Ramanujam 22 August 2018 в 01:23
поделиться

использовать numpy.round

import numpy as np
precision = 3
floats = [1.123123123, 2.321321321321]
new_float = np.round(floats, precision)
1
ответ дан rafaelvalle 22 August 2018 в 01:23
поделиться
def trunc(num, digits):
   sp = str(num).split('.')
   return '.'.join([sp[0], sp[1][:digits]])

Это должно сработать. Он должен дать вам усечение, которое вы ищете.

8
ответ дан rici 22 August 2018 в 01:23
поделиться

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

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

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

0
ответ дан Sarang 22 August 2018 в 01:23
поделиться

Вы можете выполнить:

def truncate(f, n):
    return math.floor(f * 10 ** n) / 10 ** n

тестирование:

>>> f=1.923328437452
>>> [truncate(f, n) for n in range(5)]
[1.0, 1.9, 1.92, 1.923, 1.9233]
3
ответ дан user 22 August 2018 в 01:23
поделиться
  • 1
    Это только усекает с положительными числами, отрицательные числа округлят (от нуля). – Aaron D 9 December 2016 в 12:07

Я также новичок в python и после использования некоторых бит и частей здесь я предлагаю свои два цента

print str(int(time.time()))+str(datetime.now().microsecond)[:3]

str (int (time.time ())) займет временную эпоху как int и преобразовать его в строку и присоединиться к ... str (datetime.now (). microsecond) [: 3], которая возвращает только микросекунды, конвертировать в строку и усекать до первых трех символов

-1
ответ дан user1048839 22 August 2018 в 01:23
поделиться

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

print '%.3f' % number
-3
ответ дан user44511 22 August 2018 в 01:23
поделиться

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

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
ответ дан Yohan Obadia 22 August 2018 в 01:23
поделиться
  • 1
    Большой! Приведение к int усекает как положительные, так и отрицательные числа. – Aaron D 9 December 2016 в 12:10
7
ответ дан Community 4 November 2018 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: