
μ΄λ²μ κ³ κΈ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ μλ‘ μκ²λ Typeμ λν΄μ λͺ μ€ μμ±νλ €κ³ νλ€.
μν(β©)λ 10μμ΄ νκΈμΌλ‘ κ°μ₯ μμ λ¨μμ΄κ³ , μΈν°λ· κ²°μ νΉμ μ΄μλ₯Ό λ°λ€λ³΄λ©΄ 1μ λ¨μλ λ³Ό μ μλ€. νμ§λ§ λ¬λ¬($)μ κ²½μ°μλ λ¬λ¬λ₯Ό κΈ°μ€μΌλ‘ $1.2 μ¬κΈ°μ μμμ λ¨μλ μΌνΈμ΄λ€.
μ§κΈ μ°λ¦¬λ νκ΅μμλ§ κ²°μ λ₯Ό μ λνλ μμ€ν
μ λ§λ€μ§λ§,
λΉμ§λμ€μ μμμ΄ νμ₯λμ΄μ νΉμ νκ΅ κ³ κ° λΏ μλλΌ ν΄μΈ κ³ κ° μ μΉκ° κ°λ₯νλ€λ©΄?
μ μΈκ³ 곡μ©μΌλ‘ ν΅μ©λλ λ¬λ¬ κ²°μ μμ€ν
μ μ€λΉν΄μΌ νλ€.
μ¬κΈ°μ μ μ©ν΄ λ³Ό μ μλ typeμ΄ λ°λ‘ Decimlμ΄λ€.
μ μ: integer(1,2,3,0,-1,-2)
μ€μ: real number(-2.5, 0, 3.14)
λΆμ: fraction(1/2, 3/4)
μμ: decimal(0.2, 2.718)
μμ°μ: natural number(1,2,3)
μμ λ΄μ©μ 보μμ λ decimalμ 0μ΄μμ μμλ₯Ό λνλΌ μ μλ νμ μ΄λΌλ κ²μ μ μ μλ€.
κ·Έλ¬λ©΄ μ μμ λΏ μλλΌ κΈμ΅ λ°μ΄ν°λ₯Ό λ€λ£° λλ decimalμ μ¬μ©ν΄μΌ ν κΉ?
μΌλ°μ μΌλ‘ μ¬μ©νλ λΆλ μμμ (float, double)μ κ³μ° κ³Όμ μμ λ―ΈμΈν μ€νκ° λ°μ ν μ μμ΄μ λκ³Ό κ΄λ ¨λ κ³μ°μλ μ ν©νμ§ μκΈ° λλ¬Έμ΄λ€.
Decimal νμ
μ λν μ΄ν΄DECIMAL(P,S) νμ
μ κ³ μ μμμ μ«μλ₯Ό μ μ₯ν μ μλ€.
P(Precision, μ λ°λ): μ«μμ μ΄ μλ¦Ώμλ₯Ό μλ―Έ. μμμ μΌμͺ½κ³Ό μ€λ₯Έμͺ½μ λͺ¨λ ν¬ν¨ν μλ¦Ώμ -> 1-65κΉμ§ μ§μ κ°λ₯νμ§λ§ λ°μ΄ν° λ² μ΄μ€λ§λ€ λ€λ₯Ό μ μμS(Scale, μ€μΌμΌ): μμμ μ΄νμ μλ¦Ώμλ₯Ό μλ―Έ. -> 0~PκΉμ§ κ°λ₯example.
DECIMAL(10, 2): μ΄ 10μ리 μ«μ μ€ μμμ μ΄ν 2μ리λ₯Ό μ μ₯ν©λλ€. νν κ°λ₯ν λ²μλ -99999999.99λΆν° 99999999.99κΉμ§μ λλ€. (μ΄ 8μ리 μ μλΆ + 2μ리 μμλΆ)
model Order {
id String @id @default(uuid())
userId String
totalAmount Decimal @db.Decimal(19, 4)
createdAt DateTime @default(now())
}
Decimal: Prisma λ΄λΆμμ μ¬μ©νλ νμ
μ΄λ¦@db.Decimal(P, S): λ°μ΄ν°λ² μ΄μ€μ μ€μ μμ±λ 컬λΌμ νμ
μ μ§μ P (Precision): μ«μμ μ΄ μλ¦Ώμ (μμμ μΌμͺ½ + μμμ μ€λ₯Έμͺ½).S (Scale): μμμ μ΄ν μλ¦Ώμ.a) decimal.js λΌμ΄λΈλ¬λ¦¬ μ€μΉ
pm install decimal.js
npm install -D @types/decimal.js
b) TypeScript μ½λμμ μ¬μ©νκΈ°
Decimal νμ
μ κ°μ λ€λ£° λλ νμ Decimal.js κ°μ²΄λ‘ μμ±νκ³ , κ³μ°νλ©°, λ¬Έμμ΄λ‘ λ³ννμ¬ μ¬μ©
import { PrismaClient, Prisma } from '@prisma/client';
import Decimal from 'decimal.js'; // Decimal.js λΌμ΄λΈλ¬λ¦¬ μν¬νΈ
const prisma = new PrismaClient();
async function createAndGetProduct() {
// 1. Prismaμ λ°μ΄ν° μμ±/μ
λ°μ΄νΈ μ Decimal κ° μ²λ¦¬
// Decimal κ°μ λκ²¨μ€ λλ λ¬Έμμ΄ λλ Decimal.js κ°μ²΄λ‘ λ겨μ€μΌ ν©λλ€.
const newProduct = await prisma.product.create({
data: {
name: 'Smart Watch',
price: new Decimal('199.99'), // Decimal.js κ°μ²΄λ‘ μμ±νμ¬ μ λ¬ (κ°μ₯ μμ )
// price: '199.99', // λ¬Έμμ΄λ‘ μ λ¬ν΄λ Prismaκ° Decimal.js κ°μ²΄λ‘ λ³νν΄μ€λλ€.
},
});
console.log('Created Product:', newProduct);
// newProduct.priceλ Decimal.jsμ Decimal κ°μ²΄ νμ
μ
λλ€.
// console.log(typeof newProduct.price); // object
// console.log(newProduct.price instanceof Decimal); // true
// 2. Prismaμμ Decimal κ°μ κ°μ Έμμ λ
const product = await prisma.product.findUnique({
where: { id: newProduct.id },
});
if (product) {
// product.priceλ Decimal.jsμ Decimal κ°μ²΄μ
λλ€.
console.log('Product Price (Decimal object):', product.price);
// 3. Decimal κ°μΌλ‘ κ³μ° μν μ (λ°λμ Decimal.js λ©μλ μ¬μ©)
const taxRate = new Decimal('0.10'); // 10%
const priceWithTax = product.price.t
```imes(taxRate).plus(product.price);
console.log('Price with Tax (Decimal object):', priceWithTax);
// 4. Decimal κ°μ λ¬Έμμ΄λ‘ λ³ννμ¬ μΆλ ₯νκ±°λ API μλ΅μΌλ‘ λ³΄λΌ λ
console.log('Price with Tax (string, 2 decimal places):', priceWithTax.toFixed(2)); // "219.99"
console.log('Price with Tax (full string):', priceWithTax.toString()); // "219.989" (μ νν κ°)
// 5. μ«μλ‘ λ³νν΄μΌ ν κ²½μ°
// νμν κ²½μ°κ° μλλΌλ©΄ Number()λ‘ λ³ννμ§ λ§μΈμ.
// console.log('Price with Tax (number - potentially imprecise):', Number(priceWithTax.toString()));
}
}
import { Decimal } from "@prisma/client/runtime/library";
export const buyerUser = {
id: "user_buyer_001",
email: "buyer@example.com",
name: "νλμ¬λ",
password: "password1234",
type: UserType.BUYER,
point: 0,
totalAmount: new Decimal(0),
createdAt: new Date(),
updatedAt: new Date(),
};
-> prisma λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©ν Decimal νμ μ μ°Έμ‘°
(1) Prismaμ νμ
μ μμ μΌμΉ
Prismaλ schema.prisma νμΌμ Decimal νμ
μΌλ‘ μ μλ νλλ₯Ό κ°μ Έμ€κ±°λ μμ±ν λ, JavaScriptμ κΈ°λ³Έ number νμ
μ΄ μλ decimal.js λΌμ΄λΈλ¬λ¦¬μ Decimal κ°μ²΄λ‘ λ³ννμ¬ μ²λ¦¬
-> totalAmount: new Decimal(0)μ Prismaκ° μμνλ νμ
(Decimal.jsμ Decimal κ°μ²΄)μ λ§μΆ° λ°μ΄ν°λ₯Ό μ 곡νλ κ²μ
λλ€.
(2) λΆλ μμμ μ€μ°¨ λ°©μ§
JavaScriptμ κΈ°λ³Έ number νμ
μ 64λΉνΈ λΆλ μμμ (float)μΌλ‘ ννλκΈ° λλ¬Έμ, 0.1 + 0.2κ° 0.30000000000000004μ κ°μ΄ λ―ΈμΈν μ€μ°¨λ₯Ό κ°μ§ μ μλ€. λκ³Ό κ΄λ ¨λ κ³μ°μμλ μ΄λ¬ν μμ μ€μ°¨λ νμ©λμ§ μκΈ°μ new Decimal(0)μ μ¬μ©ν¨μΌλ‘μ¨ 0μ΄λΌλ κ°μ μ νν μμ§μλ‘ νννκ³ , μμΌλ‘ μ΄ totalAmount νλμ λν λͺ¨λ κ³μ°(λ§μ
, λΊμ
λ±)λ Decimal.jsμ λ©μλ(plus(), minus(), times() λ±)λ₯Ό μ¬μ©νμ¬ μ€μ°¨ μμ΄ μ΄λ£¨μ΄μ§λλ‘ μ€λΉνλ κ²μ
λλ€.
(3) μΌκ΄λ λ°μ΄ν° μ²λ¦¬
λ°μ΄ν°λ² μ΄μ€μμ Decimal νμ μΌλ‘ κ΄λ¦¬νκΈ°λ‘ νλ€λ©΄, μ ν리μΌμ΄μ κ³μΈ΅μμλ μΌκ΄λκ² κ΄λ¦¬ν΄μΌ νλλ° new Decimal(0)μ μ΄λ¬ν μΌκ΄λ μ²λ¦¬ λ°©μμ μμμ