3.1 Integer vs Float
คุณพิมพ์ 42 กับ 42.0 — มันเหมือนกันไหม? สำหรับมนุษย์ ใช่ สำหรับคอมพิวเตอร์ ไม่เสมอไป
คิดแบบนี้
Section titled “คิดแบบนี้”ลองนึกถึง ลิ้นชักเก็บของ:
- Integer เหมือนลิ้นชักที่เก็บได้แค่ ก้อนสี่เหลี่ยมเต็มก้อน — 1 ก้อน, 2 ก้อน, 100 ก้อน ไม่มีครึ่งก้อน
- Float เหมือนลิ้นชักที่เก็บ ทราย — ใส่ได้ละเอียดแต่ไม่มีทางตวงได้แม่นยำ 100%
- Decimal เหมือนลิ้นชักที่เก็บ เหรียญ — มีหน่วยเล็กสุดชัดเจน (สตางค์) แม่นยำเสมอ
ตารางเปรียบเทียบ
Section titled “ตารางเปรียบเทียบ”| ประเภท | Google Sheets | pandas (Python) | SQL | ใช้เมื่อ |
|---|---|---|---|---|
| Integer | number (ไม่มี type แยก) | int64 / Int64 (nullable) | INTEGER, BIGINT | นับจำนวน, IDs, อายุ |
| Float | number (ไม่มี type แยก) | float64 / Float64 (nullable) | REAL, DOUBLE PRECISION | การวัด, คะแนนเฉลี่ย |
| Exact Decimal | number + format (ดูเหมือนแม่น แต่ไม่ใช่เสมอ) | decimal.Decimal | NUMERIC(p, s) | เงิน, เปอร์เซ็นต์ที่ต้องแม่นยำ |
พิมพ์ในเซลล์:
=TYPE(42) → 1 (number)=TYPE(42.5) → 1 (number — ชนิดเดียวกัน!)=TYPE("42") → 2 (text)Sheets ไม่แยก integer กับ float — ทุกอย่างเป็น “number”
ลองพิมพ์ ID ยาวๆ:
9999999999999999 → Sheets แสดง 10000000000000000!เพราะ float 64-bit มีความแม่นยำแค่ ~15-17 หลัก ตัวเลข 16 หลักเกินขีดจำกัดไปแล้ว
#include <stdio.h>int main() { int i = 42; float f = 42.0f; double d = 42.0;
printf("int: %d (%zu bytes)\n", i, sizeof(i)); // 4 bytes printf("float: %f (%zu bytes)\n", f, sizeof(f)); // 4 bytes printf("double: %f (%zu bytes)\n", d, sizeof(d)); // 8 bytes
// integer division vs float division printf("7 / 2 = %d\n", 7 / 2); // 3 (ตัดทศนิยมทิ้ง!) printf("7.0 / 2 = %f\n", 7.0 / 2); // 3.500000 return 0;}C แยกชัดเจน: int กับ float/double เป็นคนละ type — หาร integer ได้ผลลัพธ์ integer (ตัดทิ้ง ไม่ปัด)
import pandas as pd
# Python แยก int กับ floattype(42) # inttype(42.0) # float
# pandas — ระวัง! column ที่มี NaN จะถูก cast เป็น float อัตโนมัติdf = pd.DataFrame({"age": [25, 30, None]})print(df.dtypes) # age float64 ← เพราะ NaN!
# ใช้ Int64 (nullable integer) แก้ปัญหานี้df["age"] = df["age"].astype("Int64")print(df.dtypes) # age Int64print(df)# age# 25# 30# <NA> ← ยัง missing อยู่ แต่ไม่ถูก cast เป็น float-- สร้างตารางพร้อม type ที่ชัดเจนCREATE TABLE products ( id INTEGER, -- จำนวนเต็ม price NUMERIC(10, 2), -- ทศนิยม 2 ตำแหน่ง (แม่นยำ) weight DOUBLE PRECISION -- ทศนิยม (ประมาณ));
INSERT INTO products VALUES (1, 199.99, 0.75);INSERT INTO products VALUES (2, 49.50, 1.2);
-- integer division ใน SQLSELECT 7 / 2; -- 3 (integer / integer = integer)SELECT 7.0 / 2; -- 3.5 (ถ้ามี decimal point = float result)SELECT CAST(7 AS REAL) / 2; -- 3.5กฎง่ายๆ: เลือก Type ยังไง
Section titled “กฎง่ายๆ: เลือก Type ยังไง”| สถานการณ์ | ใช้ Type |
|---|---|
| นับจำนวน, IDs | Integer |
| การวัดทั่วไป (น้ำหนัก, อุณหภูมิ) | Float |
| เงิน, ราคา, เปอร์เซ็นต์ที่ต้องตรง | Exact Decimal |