# How to store a float or decimal in a contract? [duplicate]

I want to store the purchase price of a digital asset within the contract and then allow a user to purchase it. I have the following struct with some demo hard coded values but using a uint for the purchasePrice field isn't working

``````Asset memory _asset = Land({
geoPoint1: 'ldsfsdfsdf',
geoPoint2: 'ldsfsdfsdf',
geoPoint3: 'ldsfsdfsdf',
geoPoint4: 'ldsfsdfsdf',
creationTime: uint64(now),
itemdemo: 100000,
purchasePrice: 1.20
});
``````
• Core language does not support fractional numbers yet, though there are libraries for his. Apr 22, 2019 at 3:31

Deep down, everything is `uint`.

In practice, what this means is you should establish the minimum unit and maximum divisibility your app supports. For example, a "dollar" (generally) has two decimals (penny) and no further division is (generally) possible.

Suppose you want up to 4 decimal places. Use integers raised by 10**4. It is a best practice to externalize this concern from the contract. That is, leave it to clients to convert contract style numbers to human-readable notation.

``````purchasePrice: 12000 // using 4 decimal places consistently
``````

The ERC20 token standard and ethereum itself both use fixed decimal places and integer math internally, relying on clients to convert to human-readable notation. ERC20 leaves the decision about the number of decimals to the developer. That global parameter signals wallets and exchanges so they can know how to present the integer values.

Hope it helps.

• Thanks, I basically want to set the price in Ether so for example it may be 0.1 Eth. Jan 4, 2018 at 20:31
• That's a `1` with 16 `0`'s after it. The base unit is called a "wei". Jan 5, 2018 at 0:38
• Ether has 18 decimals, not 16. Apr 22, 2019 at 3:31
• Yes, it does. When OP posted 0.1, I miscounted `0.1` as 2 digits... 17 more `0` needed in that case. Apr 22, 2019 at 6:35