graphql-python / graphql-python/graphene

Inaccurate Float-to-Decimal Conversion in `parse_value` of `Decimal` `Scalar`

Open
#1,593 0 comments 0 reactions 0 assignees View on GitHub
🐛 bug
Dominant language
Python
Stars
8.2k
Forks
818
PR merge metrics
No merged PRs in 30d

Description

## Current Behavior
The `parse_value` function currently converts the input using `_Decimal(value)`. When a float is passed as input, this conversion may lead to precision loss due to the inherent imprecision of floating-point representations.

## Steps to Reproduce
1. Call `Decimal.parse_value(0.01)`.
2. Observe that the resulting `Decimal` does not accurately represent the value `0.01` instead gives`0.01000000000000000020816681711721685132943093776702880859375` which is inaccurate.

## Expected Behavior
The function should convert the input to a string before creating the `Decimal` object (i.e., using `_Decimal(str(value))`). This approach ensures that decimal values are accurately converted, even if not provided as string, preserving their intended precision.

see [Strawberry implementation](https://github.com/strawberry-graphql/strawberry/blob/2af374359e9722980f5bc15b0d7158c8d54367b6/strawberry/schema/types/base_scalars.py#L25)

## Suggested Fix
Modify the `parse_value` function as follows:

```python
@staticmethod
def parse_value(value):
try:
return _Decimal(str(value))
except Exception:
return Undefined
```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.