# Python技法：浮点数取整、格式化和NaN处理

## 1. 取整的三种方法

[En]

This method directly truncates the fractional portion of a floating-point number (positive or negative).

print(int(2.7)) # 2
print(int(-2.7)) # -2


PS: 上面所调用的 int()函数实际上可视为调用 int这个类的 __new__()方法。事实上我还见过代码用下面这种奇技淫巧写法来创建 int对象：

type = int
x = type(42)
print(x)  # 42


[En]

The rounding rules for this method are shown in the following figure:

print(math.ceil(-1.27)) # -1
print(math.floor(-1.27)) # -2
print(math.ceil(1.27)) # 2
print(math.floor(1.27)) # 1


round原型为 round(value, ndigits)，可以将一个浮点数取整到固定的小数位。该函数对正数和负数都采取就近取整原则，而当某个值恰好等于两个整数间一半时，取整操作会取到离该值最近的那个偶数。像1.5和2.5这样的值都会取整到2。示例如下：

print(round(1.23, 0)) # 1.0
print(round(1.23, 1)) # 1.2
print(round(1.27, 1)) # 1.3
print(round(-1.27, 1)) # -1.3
print(round(1.25361, 3)) # 1.254
print(round(1.5, 0)) # 2.0
print(round(2.5, 0)) # 2.0


a = 1627731
print(round(a, -1)) # 1627730
print(round(a, -2)) # 1627700
print(round(a, -3)) # 1628000


## 2. 格式化浮点数输出

x = 1234.56789
s = format(x, "0.2f")
print(type(s), format(x, "0.2f")) #  1234.57


0.2f二者是等效的。

往右调整以对齐到10个字符
print(format(x, ">10.1f")) #     1234.6

print(format(x, "


print(format(x, "e")) # 1.234568e+03

print(format(x, "0.2E")) # 1.23E+03



swap_separators = {ord("."):",", ord(","):"."}
print(format(x, ",").translate(swap_separators)) # 1.234,56789


print("value is {:0.3f}".format(x)) # value is 1.235
print("The value is {:0,.2f}".format(x)) # The value is 1,234.57


print("%.2f" % x)

print("%10.1f" % x)

print("%-10.1f" % x)


## 3. 执行精确的小数计算

a = 2.1
b = 4.2
c = a + b
print(c) # 6.300000000000001
print(c==6.3) # False
print(round(c, 2)) # 6.3 企图这样修正精度（？？？）


from decimal import Decimal

a = Decimal('4.2')
b = Decimal('2.1')
print(type(a + b), a + b) #  6.3
print((a + b) == Decimal('6.3')) # True


print(type(a + 1), a + 1) #  5.2


print((a + b) == 6.3) # False


decimal模块的强大之处在于在计算过程中灵活地控制数字的位数和四舍五入，如我们可以创建一个本地的上下文环境然后修改精度的设定，如：

from decimal import localcontext
a = Decimal("1.3")
b = Decimal("1.7")
print(a/b) # 0.7647058823529411764705882353
with localcontext() as ctx:
ctx.prec = 3
print(a/b) # 0.765

with localcontext() as ctx:
ctx.prec = 50
print(a/b) # 0.764705882352941176470588235294117647058823529


nums = [1.23e+18, 1, -1.23e+18]
print(sum(nums)) # 0.0


import math
print(math.fsum(nums)) # 1.0


## 4. 无穷大、负无穷大和NaN的判断测试

a = float("inf")
b = float("-inf")
c = float("nan")
print(a, b, c) # inf -inf nan


print(math.isinf(a)) # True
print(math.isnan(c)) # True


[En]

Infinity values are propagated in mathematical calculations, such as:

a = float("inf")
print(a + 45) # inf
print(a * 10) # inf
print(10/a) # 0.0


a = float("inf")
print(a/a) # nan
b = float("-inf")
print(a + b) # nan


NaN会通过所有的操作进行传播，且不会引发任何异常，如：

c = float("nan")
print(c + 23) # nan
print(c / 2) # nan
print(c + 2) # nan


c = float("nan")
d = float("nan")
print(c == d) # False
print(c is d) # False


Original: https://www.cnblogs.com/orion-orion/p/16296007.html
Author: orion-orion
Title: Python技法：浮点数取整、格式化和NaN处理

(0)

### 大家都在看

• #### pyhton_Pandas教程

Pandas 是 Python 语言的一个扩展程序库，用于数据分析。 Pandas 是一个开放源码、BSD 许可的库，提供高性能、易于使用的数据结构和数据分析工具。 Pandas …

Python 2023年5月24日
0125
• #### pygame简单小游戏代码_用pygame实现一个简单的垃圾分类小游戏（已获校级二等奖）！…

项目简介 本项目报名参加了”兖州中材杯”武汉理工大学第十一届环保创意作品大赛艺术理念组比赛。组员共三名，本人负责代码实现部分，其余两人分别负责项目策划与场景…

Python 2023年9月22日
0120
• #### 一、DataFrame of pandas & 插入或删除行、列

插入或删除行、列 这里举例df为原dataframe,axis为0表示删除行，axis为1表示删除列 1、删除一行 df.drop(0,axis=0,inplace=False) …

Python 2023年8月8日
077
• #### pytest框架_@pytest.fixture()

pytest的几大函数介绍：@pytest.yield_fixture()@pytest.mark.xfail()@pytest.mark.skipif （1）@pytest.fi…

Python 2023年9月12日
091
• #### 价值10K+的Python面试题，珍藏已久，分享给大家！

Python 2023年11月9日
073
• #### python点击按钮切换图片_Python matplotlib如何在一个窗口画多张图，使用forward to next view按钮切换…

–– coding: utf-8 –– from matplotlib.figure import Figure from matp…

Python 2023年9月5日
087
• #### python从入门到精通——完整教程

文章目录 一、pycharm下载安装 二、python下载安装 三、pycharm上配置python 四、配置镜像源让你下载嗖嗖的快 * – 4.1）pycharm内部…

Python 2023年7月31日
0172
• #### numpy的安装和创建

安装 1.以 管理员 的形式打开cmd 2.输入命令安装numpy模块 pip install numpy 3.使用一下命令查看是否安装成功 创建 先导包 import numpy…

Python 2023年8月29日
0131
• #### 基于Pycharm实现Web开发

Python 2023年8月9日
0136
• #### 【C++】深拷贝和浅拷贝

目录 浅拷贝 深拷贝 字符串的构造 例有两个类的深拷贝： 浅拷贝 在类中，若我们不写拷贝构造函数，则程序会提供一个默认的拷贝构造函数，该函数为浅拷贝。 //默认拷贝构造 &#821…

Python 2023年10月27日
0107

回答1： Python 是一个轻量级的Web应用框架，用于快速构建Web应用程序。将其用作 服务器非常简单。 首先，我们需要安装 库。可以使用pip命令在命令行中运行以下命令进行安…

Python 2023年8月12日
088
• #### Transformer前沿——语义分割

Transformer 进军语义分割 进军方向 SETR: Rethinking Semantic Segmentation from a Sequence-to-Sequence…

Python 2023年9月30日
0156
• #### [Python] 开发一个局域网联机小游戏

python做一个局域网联机小游戏【游戏工程师第一课】 我们在大学时期都学过网络方面呢课程，其中在学习编程的过程中，学习好的童鞋可能经常会听到套接字、网络编程之类的词汇，笔者今天就…

Python 2023年9月23日
094
• #### matplotlib 设置标注方向_Python 使用matplotlib画图添加标注、及移动坐标轴位置

import matplotlib.pyplot as plt import matplotlib import numpy as np 解决中文乱码问题，引入windows字体库…

Python 2023年9月5日
0132
• #### Django根据已有数据库表生成模型

setting.py文件中配置默认连接的数据 DATABASES = { "default" : { "ENGINE":"djan…

Python 2023年8月5日
0131
• #### openpose环境搭建（详细教程CPU/GPU）windows 10+python 3.7+CUDA 11.6+VS2022

玩转OpenPose 【玩转OpenPose】编译篇 * 一、开发环境 二、下载与安装 – 2.1 CUDA（用于高性能计算）与 CUDNN（用于深度神经网络计算的支持…

Python 2023年8月1日
0191