<jupyter_start><jupyter_text>Ограниченная точность представления чисел типа float<jupyter_code>nums = [1.100, 1.563, 2.663]
nums[0] + nums[1] == nums[2]
print(*nums, nums[0] + nums[1], sep='\n')<jupyter_output>1.1
1.563
2.663
2.6630000000000003<jupyter_text>Посмотрим, как конвертировать float к binary и обратно и то, как накапливается ошибка.<jupyter_code>import struct

def bin2float(b):
    ''' Convert binary string to a float.

    Attributes:
        :b: Binary string to transform.
    '''
    h = int(b, 2).to_bytes(8, byteorder="big")
    return struct.unpack('>d', h)[0]


def float2bin(f):
    ''' Convert float to 64-bit binary string.

    Attributes:
        :f: Float number to transform.
    '''
    [d] = struct.unpack(">Q", struct.pack(">d", f))
    return f'{d:064b}'
float2bin(nums[0])
float2bin(nums[1])
bin2float(float2bin(nums[0] + nums[1]))<jupyter_output><empty_output><jupyter_text>Решение: точное представление с помощью `decimal`<jupyter_code>from decimal import Decimal

for i, num in enumerate(nums):
    # обратите внимание:
    # представление в виде строк
    nums[i] = Decimal(str(num))
nums[0] + nums[1] == nums[2]
print(*nums, nums[0] + nums[1], sep='\n')<jupyter_output>1.1
1.563
2.663
2.663<jupyter_text>Почему не использовать всюду? Ошибка обычного представления мала, а расчет с типом decimal более трудозатратен.  Альтернативная ситуация: `fractions`<jupyter_code>nums = [1/3, 1/7, 1/21]
nums[0] * nums[1] == nums[2]
nums[2]
from fractions import Fraction
nums[0] = Fraction(1, 3)
nums[1] = Fraction(1, 7)
nums[0] * nums[1]<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.15172413793103448, 'fraction_numerical': 0.06269592476489028, 'mean_word_length': 4.933085501858736, 'pattern_counts': {'":': 0, '<': 15, '<?xml version=': 0, '>': 18, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 1, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '141923', 'license': 'MIT', 'n_tokens_mistral': 730, 'n_tokens_neox': 718, 'n_words': 144, 'path': 'decimal_fractions/decimal_fractions.ipynb', 'repo_name': 'matyushkin/tiktok', 'size': '1595'}