Jest.js 开玩笑的问题很奇怪的情况:比较数字[重复]

l2osamch  于 2023-09-28  发布在  Jest
关注(0)|答案(1)|浏览(102)

此问题已在此处有答案

Is floating point math broken?(33答案)
26天前关闭

export class AppService {
  calculatePrice(books: Book[]): number {
    // The idea is to group a sets of books together
    if (books.length === 0) return 0;
    if (books.length === 1) return PRICE;

    const flatBooks = books.flat(2);
    const setOfBooks = [...new Set(flatBooks)];

    const cumulate = PRICE * setOfBooks.length * DISCOUNT[setOfBooks.length];
    // remove elements
    for (const book of setOfBooks) {
      const index = flatBooks.indexOf(book);
      flatBooks.splice(index, 1);
    }

    console.log(cumulate);

    return cumulate + this.calculatePrice(flatBooks);
  }
}

好吧,我做了一个递归函数的测试,但我得到了一个奇怪的情况。
而不是有184.4€的一组书的测试,我得到了184.39999999999999998
我用了一个加法和一个乘法,所以不可能得到这个价格所有细节都在下面
https://github.com/wajdibenabdallah/liberation-kata
只做clone然后pnpm i然后pnpm t

rsaldnfx

rsaldnfx1#

由于floating point math is inaccurate,您需要使用toBeCloseTo Jest匹配器。
IOW,在你目前正在做的测试中,例如。

expect(appController.calculatePrice(booksExample1)).toBe(PRICE);

你可以做

expect(appController.calculatePrice(booksExample1)).toBeCloseTo(PRICE);

如果您不想切换到精确小数(例如,decimal.js)。

相关问题