Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Memotong Nilai Terapung Dengan Tepat Tanpa Pembundaran?

Bagaimana untuk Memotong Nilai Terapung Dengan Tepat Tanpa Pembundaran?

DDD
DDDasal
2024-11-05 19:47:02746semak imbas

How to Precisely Truncate Float Values Without Rounding?

Bagaimana untuk Mendapatkan Nilai Terapung Dipenggal Dengan Tepat?

Memotong nilai apungan, atau mengalih keluar digit melebihi bilangan tempat perpuluhan yang ditentukan, ialah operasi biasa dalam pengaturcaraan. Walau bagaimanapun, mencapai pemangkasan yang tepat tanpa pembundaran boleh menjadi mencabar kerana batasan perwakilan titik terapung.

Memahami Isu

Pertimbangkan contoh:

1.923328437452 -> 1.923

Seorang naif pendekatan adalah untuk menukar apungan kepada rentetan dan memotongnya, tetapi ini boleh menyebabkan ralat disebabkan oleh sifat perwakilan titik terapung yang tidak tepat. Nilai titik terapung yang berbeza mungkin mempunyai perwakilan binari yang sama, menghasilkan pemangkasan yang tidak jelas.

Kaedah Disyorkan

Untuk versi Python 2.7 dan ke atas, fungsi berikut menyediakan pemangkasan yang tepat tanpa pembundaran:

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '{}'.format(f)
    if 'e' in s or 'E' in s:
        return '{0:.{1}f}'.format(f, n)
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])

Penjelasan

Inti kaedah ini adalah untuk menukar apungan kepada rentetan menggunakan '{}'.format(f) dan memotong rentetan kepada bilangan tempat perpuluhan yang dikehendaki. Untuk nilai dalam tatatanda saintifik ('e' atau 'E'), sintaks '{0:.{1}f}'.format(f, n) digunakan untuk menentukan ketepatan.

Pengendalian Khas Kes

Dalam kes yang jarang berlaku, terapung sangat hampir dengan nombor bulat mungkin masih tersalah dipotong. Untuk kes sedemikian, nyatakan ketepatan yang lebih tinggi untuk memastikan pembundaran semasa penukaran rentetan tidak menjejaskan keputusan.

Alternatif untuk Versi Python Lama

Untuk versi Python di bawah 2.7, kaedah yang kurang tepat melibatkan pembundaran apungan kepada 12 tempat perpuluhan sebelum pemotongan:

def truncate(f, n):
    '''Truncates/pads a float f to n decimal places without rounding'''
    s = '%.12f' % f
    i, p, d = s.partition('.')
    return '.'.join([i, (d+'0'*n)[:n]])

Kesimpulan

Kod ini menyediakan penyelesaian yang mantap untuk memotong nilai apungan tanpa pembundaran, memastikan pemangkasan yang tepat untuk pelbagai input.

Atas ialah kandungan terperinci Bagaimana untuk Memotong Nilai Terapung Dengan Tepat Tanpa Pembundaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn