Stripe stores values as cents. From the docs:
Zero-decimal currencies
All API requests expect amounts to be provided in a currency’s smallest unit. For example, to charge 10 USD, provide an amount value of 1000 (i.e., 1000 cents).
I assume that the API responses work alike.
To get the correct output, you have to divide the USD value by 100, e.g.:
<%= number_to_currency(@service.amount.fdiv(100)) %>
There's also the Money gem which might be a better alternative. It stores both, the value (as cents) and its currency, and comes with formatting:
require 'money'
money = Money.new(@service.amount, @service.currency)
#=> #<Money fractional:2895 currency:USD>
money.format
#=> "$28.95"