جافا سكريبت - هل هناك طريقة لاستخدام Zod للتحقق من أن الرقم يحتوي على ما يصل إلى رقمين عشريين؟


لدي كائن يحتوي على خاصية رقمية. أود التأكد من أن الرقم يحتوي على خانتين عشريتين كحد أقصى.

مثال: 1/جيد 1.1/جيد 1.11/جيد 1.111/سيئ

هل هناك طريقة لفعل ذلك؟

اطلعت على وثائق زود وبحثت على الويب. وجدت أنني كنت أستطيع القيام بذلك بسهولة إذا كانت خاصيتي نصية. لست متأكداً بشأن الرقم.

الإجابة رقم 1

z.number().multipleOf(0.01)

سوف يقوم بالحيلة (نعم، يمكن أن تعمل مع غير الأعداد الصحيحة أيضًا!).

ومع ذلك، أشعر بالقلق بشأن مشكلة تمثيل IEEE 754 (لها حتى اسمها الخاص - لكنني نسيت - وليست محددة لـ JS)، عندما

z.number().multipleOf(0.01).parse(0.1 + 0.1 + 0.1)

سوف يرمي، لأن 0.1 + 0.1 + 0.1 خلف الكواليس تصبح 0.300000000004

ربما سيكون refine() أكثر موثوقية عند التحقق مقابل Number.EPSILON:

z.number()
  .refine(x => x * 100 - Math.trunc(x * 100)< Number.EPSILON)
  .parse(0.1 + 0.1  + 0.1) // ok

[تحديث] كما لاحظ @captain-yossarianfromUkraine، يجب أن يساعد Number.EPSILON في مسألة الأعداد العشرية

لا يمكن لـ PS تقييم هذا النهج مقابل z.custom() المقترح من قبل @vera