graphql-python / graphql-python/graphene
Inaccurate Float-to-Decimal Conversion in `parse_value` of `Decimal` `Scalar`
- 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.